【问题标题】:Reassigning Smart Pointers重新分配智能指针
【发布时间】:2014-12-04 19:38:36
【问题描述】:

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

【问题讨论】:

    标签: c++ c++11 smart-pointers glib gtkmm


    【解决方案1】:

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

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

    效果:相当于shared_ptr(std::move(r)).swap(*this)

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


    对于Glib::RefPtr,场景类似于shared_ptr:复制赋值运算符(和赋值运算符模板)以相同的语义定义。如果将当前的RefPtr 分配给其他对象,则当前持有的对象引用计数器将递减,如果结果计数器值为零,则将其销毁。

    【讨论】:

    • RefPtr something = getSomething();某物 = getSomethingElse();工作正常。您不需要使用 RefPtr::swap()。当然,这里的重新分配只是减少了对第一个 Something 的引用,而不是删除它。这是一个引用计数的共享​​>智能指针。
    • @murrayc 我第一次阅读文档时一定误读了它。谢谢!
    【解决方案2】:

    对于unique_ptr,答案是肯定的:

    对象被销毁并且它的内存被释放 以下发生

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

    对象被一个潜在的用户提供的删除器销毁 调用 Deleter(ptr)。删除器调用对象的析构函数 并分配内存。

    【讨论】:

      猜你喜欢
      • 2013-12-10
      • 1970-01-01
      • 1970-01-01
      • 2017-05-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-01-07
      • 2015-07-14
      相关资源
      最近更新 更多