安全地传递指针所有权异常

时间:2015-10-02 00:33:10

标签: c++ c++11 exception-handling smart-pointers raii

我遇到的情况是,传递原始指针的所有权可能会引发异常。有几个这样的块,并且将每个块包装在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 个答案:

答案 0 :(得分: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()的任何用户注意参数的生命周期。