将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!