Передача указателя владения исключение безопасно

У меня есть ситуация, когда передача владения необработанным указателем может вызвать исключение. Есть несколько таких блоков, и было бы неправильно обернуть каждый в 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() обратить внимание на время жизни аргумента.

Другие вопросы по тегам