【问题标题】:passing pointer ownership exception-safely安全地传递指针所有权异常
【发布时间】:2015-10-02 00:33:10
【问题描述】:

我有一种情况,传递原始指针的所有权可能会引发异常。有几个这样的块,将每个块包装在 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()。这对我来说似乎是一个非常好的模式,但真的吗?我忽略了哪些陷阱?

【问题讨论】:

  • 传递unique_ptr而不是原始指针不是更好吗?
  • 好吧,从obj 我想通过原始指针访问a,所以我确实需要release()。我知道unique_ptr 很快,但这实际上是关于我可能节省的单个 CPU 周期。很好的观察,因为在obj.take() 中执行release() 可能会进一步简化我的代码;-)
  • 本质上是scope guard 模式。
  • 为什么不通过右值引用传入unique_ptr并在里面调用release呢?

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


【解决方案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() 的任何用户注意参数的生命周期。

【讨论】:

    猜你喜欢
    • 2012-07-07
    • 1970-01-01
    • 1970-01-01
    • 2015-05-11
    • 2014-04-13
    • 1970-01-01
    • 1970-01-01
    • 2013-07-21
    • 1970-01-01
    相关资源
    最近更新 更多