我想使用shared_from_this
,如下所示:
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_ptr拥有的示例对象强制调用example.foo()
。
例如,我想允许以下内容:
example * p = new example;
p->foo();
但这似乎是一个错误,因为p不归shared_ptr
所有。如果我弄错了,请纠正我。
如果我没有弄错的话,我该怎么办呢?
答案 0 :(得分:3)
我的问题是我不想仅使用shared_ptr拥有的示例对象强制调用
example.foo()
。
如果对象不属于shared_ptr
,您希望如何将bar
传递给shared_ptr
?你想传递一个空的shared_ptr
吗?
你可以使用shared_ptr
的别名构造函数做一些讨厌的事情,但我不推荐它。
如果我弄错了,请纠正我。
你没有弄错,enable_shared_from_this<T>::shared_from_this()
有一个先决条件,即至少有一个shared_ptr
拥有该对象。
如果我没有弄错的话,我该怎么办呢?
没有可移植的方法来避免这种情况,因为它是一个先决条件,你不能违反先决条件,但这可能“有效”(对于某些工作价值):
void example::foo ()
{
shared_ptr<example> ptr;
try {
ptr = shared_from_this(this);
} catch (boost::bad_weak_ptr const&) {
}
bar(ptr);
}
答案 1 :(得分:2)
从T
派生您的课程std::enable_shared_from_this<T>
时,您允许由shared_ptr<T>
管理的对象生成其他shared_ptr<T>
个实例 - 这样您就可以解决这个问题做的习惯
return std::shared_ptr<T>(this); // bad!
通常会导致双重删除问题(因为此指针已由不同的std::shared_ptr<T>
拥有)。此处显示的所有权问题与您当前的问题分解为:
引自here:
enable_shared_from_this的常见实现是为此保存弱引用(例如std :: weak_ptr)。 std :: shared_ptr的构造函数可以检测到enable_shared_from_this base的存在,并与现有的std :: shared_ptrs共享所有权,而不是假设指针不是由其他任何人管理的。
当你签订合同时,你做了(尽管如上面的评论中提到的那样,不是使用导出,而是使用shared_from_this()
),最好保留它。