Boost 同一地址,多个“;共享“ptr”;s、 从\u this启用\u shared\u&;自定义删除程序

Boost 同一地址,多个“;共享“ptr”;s、 从\u this启用\u shared\u&;自定义删除程序,boost,shared-ptr,weak-ptr,Boost,Shared Ptr,Weak Ptr,与指向同一对象但不共享底层ref-count结构的多个共享_-ptr对象相关,以及围绕这些对象的无数其他问题 如果对象继承了上述问题中的“enable_shared_from_this”,会发生什么情况?我的共享\u从\u this()返回什么?一个有自定义删除器还是一个没有 struct B : boost::enable_shared_from_this<B> { boost::weak_ptr < B > get_weak() { return shar

与指向同一对象但不共享底层ref-count结构的多个共享_-ptr对象相关,以及围绕这些对象的无数其他问题

如果对象继承了上述问题中的“enable_shared_from_this”,会发生什么情况?我的共享\u从\u 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();
}
struct B:boost::从\u中启用\u共享\u{
boost::weak_ptrget_-weak(){
从_this()返回共享的_;
}
};
无效(B*){
}
int main(){
B*b0=新的B;
boost::shared_ptrsddb0(b0,不含任何内容);
boost::weak_ptrswddb0(sddb0->get_-weak());
//这有自定义删除程序吗???
boost::shared_ptrsddb1=swddb0.lock();
boost::shared_ptrscdb0(b0);
boost::weak_ptrswcdb0(sddb0->get_-weak());
//这个*没有*自定义删除程序吗???
boost::shared_ptrscdb1=swcdb0.lock();
}

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

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

不要这样写:

B * b0 = new B;

boost::shared_ptr < B > sddb0(b0, doNothing);
sddb1
sddb0
共享所有权,因此具有相同的删除器

您可以使用
get\u deleter
,或在
doNothing
中写入
stdout
,或使用
owner\u less
比较指针的所有者来测试这一点

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

boost::shared_ptrscdb0(b0)


此base的
弱ptr
成员的
enable\u shared\u通过上一行重新分配,因此它与
scdb0
共享所有权,而不是
sddb0
。因此,当您在该点之后调用
get\u-weak
时,它将返回一个弱指针,该指针与
scdb0
共享所有权,因此没有自定义的删除程序。同样,您可以通过查看未调用
doNothing
,或者通过使用
owner\u less
轻松验证删除程序是否与所属对象关联,并在最后一个所有者删除其引用时用于处理该对象,因此共享同一对象所有权的所有指针也共享删除程序。删除器不存储在单个
shared_ptr
对象中,它与引用计数一起存储在堆中,因此由共享相同计数的所有对象共享

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

不要这样写:

B * b0 = new B;

boost::shared_ptr < B > sddb0(b0, doNothing);
sddb1
sddb0
共享所有权,因此具有相同的删除器

您可以使用
get\u deleter
,或在
doNothing
中写入
stdout
,或使用
owner\u less
比较指针的所有者来测试这一点

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

boost::shared_ptrscdb0(b0)


base的
弱ptr
成员的
enable\u shared\u通过上一行重新分配,因此它与
scdb0
共享所有权,而不是
sddb0
。因此,当您在该点之后调用
get\u-weak
时,它将返回一个弱指针,该指针与
scdb0
共享所有权,因此没有自定义的删除程序。同样,您可以通过查看没有调用
doNothing
,或者使用
owner\u less

来轻松验证,感谢您花时间回答这个问题。我在这里查看了enable_shared_的boost代码,它重新分配了弱指针,但我认为我们应该将其视为一个实现细节,而不是依赖它。感谢您花时间回答这个问题。我在这里查看了enable_shared_的boost代码,它重新分配了弱指针,但我认为我们应该将其视为一个实现细节,而不是依赖它。
//  Does this have a custom deleter???
boost::shared_ptr < B > sddb1 = swddb0.lock();