将'this'转换为std :: shared_ptr

时间:2015-01-12 01:45:23

标签: c++ c++11 shared-ptr

我在一个类上有一个方法可以使一个特定的实例成为一个" active"实例:

void makeActive() { activeInstance = this; }

但是,由于activeInstance的类型为std::shared_ptr< ClassName >,因此无法正常工作。如何将this投射到std::shared_ptr<ClassName>

2 个答案:

答案 0 :(得分:22)

如果您的对象已被shared_ptr拥有,则可以通过让对象继承自std::enable_shared_from_this

来生成另一个shared_ptr

此代码将起作用:

void makeActive() { activeInstance = shared_from_this(); }

如果shared_ptr您的对象尚未拥有,那么您确定不希望在makeActive()中创建一个shared_ptr当最后一个被销毁时,它会尝试删除你的对象。

答案 1 :(得分:3)

这将“有效”(但见下文):

activeInstance.reset(this);

问题是,意味着什么?当activeInstance超出范围时,this将为delete d。这可能不是你想要的。您还应该阅读enable_shared_from_this,这可以让您说:

activeInstance = shared_from_this();

另一个选择是使用“null deleter”,即指定一个什么都不做的删除函数:

void NoDelete(void*) {}

activeInstance.reset(this, NoDelete);

在许多情况下,这将是一个安全和正确的解决方案,假设this将被其他地方的其他方法删除,而不是在activeInstance的最后一次取消引用之前。