将boost::shared_from_this用于有时不是';t由共享ptr所有
我想使用此中的将boost::shared_from_this用于有时不是';t由共享ptr所有,boost,shared-ptr,this-pointer,Boost,Shared Ptr,This Pointer,我想使用此中的shared\u,如下所示: class example; // Forward declaration. void bar(boost::shared_ptr<example>); class example : public boost::enabled_shared_from_this<example> { void foo () { bar(shared_from_this(this)); } };
shared\u,如下所示:
class example; // Forward declaration.
void bar(boost::shared_ptr<example>);
class example : public boost::enabled_shared_from_this<example>
{
void foo ()
{
bar(shared_from_this(this));
}
};
但这似乎是一个错误,因为p不属于shared\u ptr
。如果我弄错了,请纠正我
如果我没弄错的话,我怎样才能结束这一切
我的问题是,我不想强制example.foo()
仅使用共享的\u ptr拥有的示例对象调用
如果对象不属于共享的\u ptr
所有,您希望如何将共享的\u ptr
传递到条
?是否要传递一个空的共享\u ptr
您可以使用shared\u ptr
的别名构造函数来做一些糟糕的事情,但我不推荐使用它
如果我弄错了,请纠正我
您没有弄错,enable_shared_from_this::shared_from_this()
有一个先决条件,即至少有一个shared_ptr
拥有该对象
如果我没弄错的话,我怎样才能结束这一切
没有可移植的方法可以避免这种情况,因为这是一个先决条件,您不能违反先决条件,但是这可能会“起作用”(对于工作的某些价值):
void示例::foo()
{
共享ptr;
试一试{
ptr=从本(本)共享的本;
}捕获(boost::坏的\u弱的\u ptr常量&){
}
酒吧(ptr);
}
我的问题是,我不想强制example.foo()
仅使用共享的\u ptr拥有的示例对象调用
如果对象不属于共享的\u ptr
所有,您希望如何将共享的\u ptr
传递到条
?是否要传递一个空的共享\u ptr
您可以使用shared\u ptr
的别名构造函数来做一些糟糕的事情,但我不推荐使用它
如果我弄错了,请纠正我
您没有弄错,enable_shared_from_this::shared_from_this()
有一个先决条件,即至少有一个shared_ptr
拥有该对象
如果我没弄错的话,我怎样才能结束这一切
没有可移植的方法可以避免这种情况,因为这是一个先决条件,您不能违反先决条件,但是这可能会“起作用”(对于工作的某些价值):
void示例::foo()
{
共享ptr;
试一试{
ptr=从本(本)共享的本;
}捕获(boost::坏的\u弱的\u ptr常量&){
}
酒吧(ptr);
}
从std::enable_shared_from_this
派生类T
时,您允许由shared_ptr
管理的对象生成额外的shared_ptr
实例,因此您可以克服这样做的坏习惯
return std::shared_ptr<T>(this); // bad!
return std::shared_ptr(this);//糟糕!
这通常会导致双重删除的问题(因为此指针已由另一个std::shared\u ptr
拥有)。此处显示的所有权问题与当前问题的分类相同:
引自:
enable_shared_from_的一个常见实现是保存对此的弱引用(如std::weak_ptr)。std::shared_ptr的构造函数可以检测来自该库的enable_shared_的存在,并与现有std::shared_ptr共享所有权,而不是假设指针不由任何其他人管理
当你签署了一份合同,并且你确实签了(尽管在上面的评论中提到了不是通过派生,而是通过使用shared\u from\u this()
),最好保留它。当从std::enable\u shared\u from\u this
派生你的类T
时,您允许由shared_ptr
管理的对象生成额外的shared_ptr
实例,因此您可以克服这样做的坏习惯
return std::shared_ptr<T>(this); // bad!
return std::shared_ptr(this);//糟糕!
这通常会导致双重删除的问题(因为此指针已由另一个std::shared\u ptr
拥有)。此处显示的所有权问题与当前问题的分类相同:
引自:
enable_shared_from_的一个常见实现是保存对此的弱引用(如std::weak_ptr)。std::shared_ptr的构造函数可以检测来自该库的enable_shared_的存在,并与现有std::shared_ptr共享所有权,而不是假设指针不由任何其他人管理
当你签署了一份合同,你做到了(虽然在上面的评论中提到,不是使用派生,而是使用shared\u from\u this()
),最好保留它。当从std::enable\u shared\u from\u this
派生时,你签署了一份合同,并用你的例子打破了它。你能补充解释一下吗?@nijansen,实际上,契约是在shared\u from\u this()
成员函数上的,因此仅在调用该函数时适用,而不是从enable\u shared\u from\u this
@jonathanwelly你说得对,这是非常草率的。我在下面的回答中澄清了这一点。当从std::enable_shared_from_this
派生时,您签署了一份合同,并用您的示例打破了它。您可以添加一个解释吗?@nijansen,实际上该合同位于shared_from_this()
成员函数上,因此仅在调用该函数时适用,不是从enable\u shared\u\u这个
@JonathanWakely你是对的,这是非常草率的说法。我在下面的回答中阐明了这一点。阅读本文时,在你的脑海中将std
替换为boost
——两者实际上并不完全相同,但在这个领域,两者的适用方式完全相同谢谢你的回答。虽然我不理解这句话:“在内部,类通常持有对自身的引用(如std::weak_ptr),当试图通过手动分配访问它时,会引发异常”。“你能再详细一点吗?”我的措辞糟透了。我编辑了它,这样那些花了比我更多时间思考的人就可以
return std::shared_ptr<T>(this); // bad!