2014-12-04 89 views
7

一般来说,智能指针如std::unique_ptrGlib::RefPtr在重新分配指向另一个对象时会删除它们的对象,因为它们是保存给定对象的唯一指针(显然在std::unique_ptr的情况下隐含)?重新分配智能指针

回答

9

对于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)

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

影响:等价于shared_ptr(std::move(r)).swap(*this)

如果*this是最后拥有的对象,那么现在临时是 - 将被销毁。


对于Glib::RefPtr的情况类似于shared_ptr:副本赋值运算符(和赋值运算符模板)与相同的语义定义。如果当前的RefPtr被分配给其他值,则当前保持对象引用计数器递减并且如果结果计数器值为零则将其销毁。

+0

RefPtr something = getSomething(); something = getSomethingElse();工作正常。你不需要使用RefPtr :: swap()。当然,这里的重新分配只是减少了第一个东西的引用,而不是删除它。它是一个引用计数_shared_智能指针。 – murrayc 2014-12-07 19:18:04

+0

@murrayc我第一次阅读时必须误读文档。谢谢! – Columbo 2014-12-07 19:44:27

3

对于unique_ptr答案是肯定的:

对象被破坏,当任一 之后发生开发它的内存释放:

  • 的unique_ptr管理对象被销毁
  • unique_ptr通过operator =或reset()指定管理对象的另一个指针。

的目的是使用一种潜在的用户提供的删除器通过调用 删除器(PTR)破坏。删除者调用对象 的析构函数并分配内存。