在构造函数中指向this的弱指针

时间:2011-01-04 22:09:59

标签: c++ boost constructor shared-ptr weak-ptr

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

编辑:提升表格讨论weak_from_raw http://lists.boost.org/boost-users/2010/08/61541.php

2 个答案:

答案 0 :(得分:15)

我认为你引用的是is this。这似乎没有被合并到提升版本(可能是错误的)。

来自boost docs

常见问题解答

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

A。否。只能从shared_ptr创建weak_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;
    }
};

答案 1 :(得分: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!!!

但你真的不想这样做。

相关问题