安全地传递指针所有权异常
passing pointer ownership exception-safely
我有一种情况,传递原始指针的所有权可能会引发异常。有几个这样的块,将每个块包装在 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()
。这对我来说似乎是一个非常好的模式,但真的是这样吗?我忽略了哪些陷阱?
好吧,对于任何想知道的人,这就是我现在为安全传递指针所有权所做的工作:
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()
的任何用户注意生命周期参数。
我有一种情况,传递原始指针的所有权可能会引发异常。有几个这样的块,将每个块包装在 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()
。这对我来说似乎是一个非常好的模式,但真的是这样吗?我忽略了哪些陷阱?
好吧,对于任何想知道的人,这就是我现在为安全传递指针所有权所做的工作:
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()
的任何用户注意生命周期参数。