【发布时间】:2014-12-04 19:38:36
【问题描述】:
一般来说,智能指针如std::unique_ptr 和Glib::RefPtr 在重新分配指向另一个对象时会删除它们的对象,因为它们是唯一持有该给定对象的指针(显然在std::unique_ptr 的情况下暗示)?
【问题讨论】:
标签: c++ c++11 smart-pointers glib gtkmm
一般来说,智能指针如std::unique_ptr 和Glib::RefPtr 在重新分配指向另一个对象时会删除它们的对象,因为它们是唯一持有该给定对象的指针(显然在std::unique_ptr 的情况下暗示)?
【问题讨论】:
标签: c++ c++11 smart-pointers glib gtkmm
对于unique_ptr::reset,[unique.ptr.single.modifiers]/4:
效果:将
p分配给存储的指针,然后如果存储的指针的旧值old_p不等于nullptr,则调用get_deleter()(old_p).
或者移动赋值运算符,operator=(unique_ptr&& u) in [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)。
但很明显,临时对象在函数调用结束时被销毁,销毁了保持对象(如果适用)。
这与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)。删除器调用对象的析构函数 并分配内存。
【讨论】: