【问题标题】:Same address, multiple "shared_ptr"s, enable_shared_from_this & custom deleter相同地址,多个“shared_ptr”,enable_shared_from_this 和自定义删除器
【发布时间】:2012-07-08 11:51:38
【问题描述】:

Same address, multiple shared_ptr counters, is it forbidden by C++ standard? 和其他无数关于多个 shared_ptr 对象指向同一个对象但不共享底层引用计数结构的问题有关。

如果对象从上述问题中的“enable_shared_from_this”继承会发生什么?我的 shared_from_this() 返回什么?一个有自定义删除器还是一个没有?

struct B : boost::enable_shared_from_this<B> {
  boost::weak_ptr < B > get_weak() {
    return shared_from_this();
  }
};

void doNothing(B *) {
}

int main() {
  B * b0 = new B;

  boost::shared_ptr < B > sddb0(b0, doNothing);
  boost::weak_ptr < B > swddb0(sddb0->get_weak());
  //  Does this have a custom deleter???
  boost::shared_ptr < B > sddb1 = swddb0.lock();

  boost::shared_ptr < B > scdb0(b0);
  boost::weak_ptr < B > swcdb0(sddb0->get_weak());
  //  Does this *not* have a custom deleter???
  boost::shared_ptr < B > scdb1 = swcdb0.lock();
}

【问题讨论】:

    标签: boost shared-ptr weak-ptr


    【解决方案1】:

    删除器与拥有的对象相关联,并将在最后一个所有者删除其引用时将其释放,因此共享同一对象所有权的所有指针也共享删除器。删除器不存储在单个 shared_ptr 对象中,它与引用计数一起存储在堆中,因此由共享相同计数的所有对象共享。

    让我们看看你的代码。首先,我必须修复您的代码,因为它甚至没有按所示编译。测试您的问题中的代码始终是一个好主意,以避免通过让他们修复拼写错误和添加缺少的标题来浪费人们的时间。

    不要这样写:

    B * b0 = new B;
    
    boost::shared_ptr < B > sddb0(b0, doNothing);
    

    正确的做法是:

    boost::shared_ptr < B > sddb0(new B, doNothing);
    

    enable_shared_from_this&lt;B&gt; 基类有一个weak_ptr&lt;B&gt; 成员,该成员由shared_ptr 构造函数分配,因此weak_ptrsddb0 共享所有权,shared_from_this() 返回的共享指针也是如此。

    所以这个问题的答案是肯定的:

    //  Does this have a custom deleter???
    boost::shared_ptr < B > sddb1 = swddb0.lock();
    

    sddb1sddb0 共享所有权,因此具有相同的删除器。

    您可以通过使用get_deleter 或通过在doNothing 中写入stdout 或使用owner_less 来比较指针的所有者来测试它。

    这会创建一个与现有共享指针共享所有权的对象:

    boost::shared_ptr scdb0(b0);

    enable_shared_from_this&lt;B&gt; base 的weak_ptr&lt;B&gt; 成员被上面的行重新分配,因此它与scdb0 共享所有权,而不是sddb0。因此,当您在那之后调用get_weak 时,它会返回一个与scdb0 共享所有权的弱指针,因此没有自定义删除器。同样,您可以通过查看未调用 doNothing 或使用 owner_less 轻松验证这一点。

    【讨论】:

    • 感谢您抽出宝贵时间回答这个问题。我浏览了 enable_shared_from_this 的 boost 代码,它重新分配了弱指针,但我认为我们应该将其视为实现细节,而不是依赖它。
    猜你喜欢
    • 1970-01-01
    • 2020-06-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-04-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多