重新分配智能指针
一般来说,智能指针如std::unique_ptr
和Glib::RefPtr
在重新分配指向另一个对象时会删除它们的对象,因为它们是保存给定对象的唯一指针(显然在std::unique_ptr
的情况下隐含)?重新分配智能指针
对于unique_ptr::reset
,[unique.ptr.single.modifiers]/4:
影响:分配
p
所存储的指针,然后如果所存储的指针,old_p
的旧值,不等于nullptr
,请致电get_deleter()(old_p)
。在[unique.ptr.single.asgn]/2
或者移动赋值运算符,operator=(unique_ptr&& u)
:
转会所有权从
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)
。
但是很明显,临时函数在函数调用结束时被破坏,破坏了保持对象(如果适用)。
即相同的行为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管理对象被销毁
- unique_ptr通过operator =或reset()指定管理对象的另一个指针。
的目的是使用一种潜在的用户提供的删除器通过调用 删除器(PTR)破坏。删除者调用对象 的析构函数并分配内存。
RefPtr something = getSomething(); something = getSomethingElse();工作正常。你不需要使用RefPtr :: swap()。当然,这里的重新分配只是减少了第一个东西的引用,而不是删除它。它是一个引用计数_shared_智能指针。 –
murrayc
2014-12-07 19:18:04
@murrayc我第一次阅读时必须误读文档。谢谢! – Columbo 2014-12-07 19:44:27