我知道无法通过从类的构造函数调用 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表单
我知道无法通过从类的构造函数调用 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表单
我想你指的是这个。这似乎没有被合并到 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;
}
};
请参阅: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!!!
但你真的不想这样做。