将 '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
将是 delete
d。那可能不是你想要的。您还应该阅读有关 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
将在最后一个对象被销毁时尝试删除您的对象。
我在 class 上有一个方法可以使特定实例成为 "active" 实例:
void makeActive() { activeInstance = this; }
但是它不起作用,因为 activeInstance
的类型是 std::shared_ptr< ClassName >
。如何将 this
转换为 std::shared_ptr<ClassName>
?
这将 "work"(但见下文):
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
的最后一次取消引用之前删除。
如果您的对象 已经被 shared_ptr
拥有,您可以通过让您的对象继承自 std::enable_shared_from_this
[ 来生成另一个 shared_ptr
=18=]
此代码将起作用:
void makeActive() { activeInstance = shared_from_this(); }
如果您的对象 尚未被 shared_ptr
拥有,那么您肯定不想在 makeActive()
中创建对象,因为shared_ptr
将在最后一个对象被销毁时尝试删除您的对象。