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