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).
...移动赋值运算符(模板),r是shared_ptr<>&&:
效果:相当于
shared_ptr(std::move(r)).swap(*this).
如果*this是最后拥有该对象,那么现在临时是 - 它将在内部被销毁.
对于Glib::RefPtr场景类似于shared_ptr:复制赋值运算符(和赋值运算符模板)使用相同的语义定义.如果将当前RefPtr值分配给其他内容,则当前保持对象引用计数器会递减,如果结果计数器值为零,则会将其销毁.
对于unique_ptr,答案是肯定的:
发生以下任一情况时,对象将被销毁并释放其内存:
- 管理对象的unique_ptr被破坏
- 通过operator =或reset()为管理对象的unique_ptr分配了另一个指针。
通过调用Deleter(ptr),使用潜在的用户提供的删除程序销毁该对象。删除程序调用对象的析构函数并分配内存。