将 'this' 转换为 std::shared_ptr

Cast 'this' to std::shared_ptr

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

void makeActive() { activeInstance = this; }

但是它不起作用,因为 activeInstance 的类型是 std::shared_ptr< ClassName >。如何将 this 转换为 std::shared_ptr<ClassName>

这将 "work"(但见下文):

activeInstance.reset(this);

问题是,是什么意思?当 activeInstance 超出范围时,this 将是 deleted。那可能不是你想要的。您还应该阅读有关 enable_shared_from_this 的内容,这样您就可以说:

activeInstance = shared_from_this();

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

void NoDelete(void*) {}

activeInstance.reset(this, NoDelete);

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

如果您的对象 已经被 shared_ptr 拥有,您可以通过让您的对象继承自 std::enable_shared_from_this[ 来生成另一个 shared_ptr =18=]

此代码将起作用:

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

如果您的对象 尚未被 shared_ptr 拥有,那么您肯定不想在 makeActive() 中创建对象,因为shared_ptr 将在最后一个对象被销毁时尝试删除您的对象。