给C++专家的问题。
我们都知道在类构造函数中调用shared_from_this()会导致bad_weak_ptr异常,因为该实例尚未创建任何shared_ptr。
为了解决这个问题,我想到了这个技巧:
class MyClass : public std::enable_shared_from_this<MyClass>
{
public:
MyClass() {}
MyClass( const MyClass& parent )
{
// Create a temporary shared pointer with a null-deleter
// to prevent the instance from being destroyed when it
// goes out of scope:
auto ptr = std::shared_ptr<MyClass>( this, [](MyClass*){} );
// We can now call shared_from_this() in the constructor:
parent->addChild( shared_from_this() );
}
virtual ~MyClass() {}
};
有人认为这不安全,因为对象尚未完全形成。他是对的吗?
我并未使用“this”来访问成员变量或函数。此外,只要我使用初始化列表,所有成员变量都已经被初始化。我不明白这个技巧怎么可能不安全。
编辑:事实证明,这个技巧确实会产生不必要的副作用。"shared_from_this()"将指向临时的"shared_ptr",如果你不小心,我的示例代码中的父子关系将会被破坏。 "enable_shared_from_this()"的实现根本不允许这样做。感谢Sehe指出了正确的方向。
MyClass temp(myparent);
,局部变量刚刚被塞进了一个共享指针。 - user4581301static std::shared_ptr<MyClass> create() { /* “initialize”将包含对shared_from_this()的调用 */ auto ptr = std::make_shared<MyClass>(); ptr->initialize(); return ptr; }
- Paul Houx