8

我知道无法通过从类的构造函数调用 shared_from_this() 来获得 shared_ptr,因为该对象尚未构造。但是,是否有可能从构造函数中获取对象的 weak_ptr ?一些讨论“weak_from_raw()”方法的 boost 论坛帖子表明它是可能的。

编辑:讨论weak_from_raw http://lists.boost.org/boost-users/2010/08/61541.php的Boost表单

4

2 回答 2

16

我想你指的是这个。这似乎没有被合并到 boost 版本中(可能是错误的)。

来自boost 文档

经常问的问题

:一个对象可以在其构造函数中为自己创建一个weak_ptr吗?

A.不可以。weak_ptr 只能从 shared_ptr 创建,并且在对象构造时,对象的 shared_ptr 尚不存在。即使您可以为此创建一个临时 shared_ptr,它也会在构造函数结束时超出范围,并且所有 weak_ptr 实例都会立即过期。

解决方案是将构造函数设为私有,并提供一个返回 shared_ptr 的工厂函数:

class X
{
private:

    X();

public:

    static shared_ptr<X> create()
    {
        shared_ptr<X> px(new X);
        // create weak pointers from px here
        return px;
    }
};
于 2011-01-04T22:16:56.373 回答
5

请参阅:http ://boost.org/doc/libs/1_42_0/libs/smart_ptr/sp_techniques.html#in_constructor

问题不在于没有构造对象。问题是 shared_ptr 尚未构建。如果您要做的只是创建一个 shared_ptr 并将其发送到某个地方,那么一切都会好起来的。当您尝试创建一个 shared_ptr 以包含您刚刚创建的对象时。没有办法将两者联系起来,因此你有一个大问题。

shared_from_this 的工作方式是,它希望您在调用 shared_from_this 以访问它之前将对象放置为 shared_ptr 。由于你还没有这样做,因为对象的构造函数还没有完成,因此 shared_ptr 没有连接到它,你不能调用 shared_from_this。

对于weak_ptr,您会遇到完全相同的问题。

所以,换句话说,这个荒谬的结构会起作用:

struct absurd
{
  absurd()
  {
    register(shared_ptr<absurd>(this));
  }
};

...
new absurd; // better not assign to a shared_ptr!!!

但你真的不想这样做。

于 2011-01-04T22:20:09.213 回答