重新分配智能指针

avi*_*a.x 13 c++ smart-pointers glib gtkmm c++11

一般来说做智能指针,如std::unique_ptrGlib::RefPtr当另一个对象重新分配给点删除他们的对象,因为他们持有的是给定的对象(在的情况下,显然隐含的唯一指针std::unique_ptr)?

Col*_*mbo 14

对于unique_ptr::reset,[unique.ptr.single.modifiers]/4:

效果:分配p给存储的指针,然后如果old_pnullptrget_deleter()(old_p)存储的指针的旧值不等于,则调用 .

或者operator=(unique_ptr&& u)[unique.ptr.single.asgn]/2中的移动赋值运算符:

将所有权转移u*this似乎通过呼叫 reset(u.release())后跟get_deleter() = std::forward<D>(u.get_deleter()).

(相当于其他赋值运算符模板)


因为shared_ptr,重新分配有点不同.shared_ptr永远不会销毁一个被引用的对象,因为它不是最后一个拥有它的对象,所以我们假设给出了它.
shared_ptr::reset(Y*)在[util.smartptr.shared.mod]/3中指定:

效果:相当于shared_ptr(p).swap(*this).

但很明显,临时在函数调用结束时被销毁,破坏了hold对象(如果适用).
这是同样的行为operator=(shared_ptr<> const&),[util.smartptr.shared.assign]/1和4:

效果:相当于shared_ptr(r).swap(*this).

...移动赋值运算符(模板),rshared_ptr<>&&:

效果:相当于shared_ptr(std::move(r)).swap(*this).

如果*this是最后拥有该对象,那么现在临时是 - 它将在内部被销毁.


对于Glib::RefPtr场景类似于shared_ptr:复制赋值运算符(和赋值运算符模板)使用相同的语义定义.如果将当前RefPtr值分配给其他内容,则当前保持对象引用计数器会递减,如果结果计数器值为零,则会将其销毁.


Sha*_*our 5

对于unique_ptr,答案是肯定的:

发生以下任一情况时对象将被销毁并释放其内存

  • 管理对象的unique_ptr被破坏
  • 通过operator =或reset()为管理对象的unique_ptr分配了另一个指针。

通过调用Deleter(ptr),使用潜在的用户提供的删除程序销毁该对象。删除程序调用对象的析构函数并分配内存。