0

我想使用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));
    }
};

我的问题是我不想强制example.foo()只使用由 shared_ptr 拥有的示例对象来调用。例如,我想允许以下内容:

example * p = new example;
p->foo(); 

但这似乎是一个错误,因为 p 不属于 a shared_ptr。如果我错了,请纠正我。

如果我没记错的话,我该如何解决这个问题?

4

2 回答 2

3

我的问题是我不想强制example.foo()只使用由 shared_ptr 拥有的示例对象来调用。

如果对象不属于a ,您希望如何传递 a shared_ptrto ?你想传递一个空的吗?barshared_ptrshared_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);
}
于 2013-07-29T15:22:20.517 回答
2

从派生您的类Tstd::enable_shared_from_this<T>,您允许由 a 管理的对象shared_ptr<T>生成其他shared_ptr<T>实例-因此您可以解决做事的坏习惯

return std::shared_ptr<T>(this); // bad!

这通常会导致双重删除问题(因为 this 指针已经由不同的 拥有std::shared_ptr<T>)。此处显示的所有权问题与您当前的问题相同:

从这里引用:

enable_shared_from_this 的一个常见实现是持有对 this 的弱引用(例如 std::weak_ptr)。std::shared_ptr 的构造函数可以检测 enable_shared_from_this 基的存在并与现有的 std::shared_ptrs 共享所有权,而不是假设指针不由其他任何人管理。

当您签署合同并且您确实这样做了(尽管如上面的评论中提到的不是派生,而是使用shared_from_this()),最好保留它。

于 2013-07-29T15:23:45.460 回答