Col*_*mbo 14
对于unique_ptr::reset
,[unique.ptr.single.modifiers]/4:
效果:分配
p
给存储的指针,然后如果old_p
nullptr
get_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),使用潜在的用户提供的删除程序销毁该对象。删除程序调用对象的析构函数并分配内存。