Передача указателя владения исключение безопасно
У меня есть ситуация, когда передача владения необработанным указателем может вызвать исключение. Есть несколько таких блоков, и было бы неправильно обернуть каждый в try / catch просто для удаления указателей, которые не были приняты. Вместо этого я использую unique_ptr<A>
управлять моим указателем с RAII:
unique_ptr<A> a(new A());
obj.take(a.get()); // pass ownership to obj, might throw
a.release(); // release pointer since obj is now responsible
Поэтому идея заключается в том, чтобы сохранить владение необработанным указателем в текущей функции, пока он не будет успешно передан somebody.take()
, Мне кажется, это очень хороший пример, но так ли это на самом деле? Какие-нибудь подводные камни, которые я пропускаю?
1 ответ
Хорошо, для всех, кто интересуется, это то, что я сделал сейчас, чтобы безопасно передать владение указателем:
class C {
A *mem_p = nullptr;
/** take ownership exception-safely */
void take(unique_ptr<A> &&a) {
dangerous_stuff(); // may throw exception
this->mem_p = a.release();
}
~C() { delete mem_p; }
}
void some_fun() {
A *ptr = new A();
C obj;
obj.take(unique_ptr<A>(a)); // either obj owns ptr or it is freed
}
Что мне нравится в этом, так это то, что он делает семантику владения почти явной или, по крайней мере, предупреждает любого пользователя о take()
обратить внимание на время жизни аргумента.