将boost :: shared_from_this用于有时不归shared_ptr所有的对象

时间:2013-07-29 15:13:35

标签: boost shared-ptr this-pointer

我想使用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所有。如果我弄错了,请纠正我。

如果我没有弄错的话,我该怎么办呢?

2 个答案:

答案 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()),最好保留它。