我目前有一个shared_ptr
,其use_count()
为1,因此我希望自动销毁shared_ptr
(无需调用reset()
)但是这样没有发生。
我的问题是我在这里遗漏了什么吗?是否存在导致shared_ptr
不被销毁的任何情况?
我的一些类是GUI类,它们不包含构造函数或析构函数,并且具有Init()和Shutdown()函数。对于这种类型的类,shared_ptr似乎不会被自动销毁。
谢谢,
答案 0 :(得分:1)
从显而易见的开始:如果shared_ptr
的计数为1,则意味着它仍然有一个引用。
实际上,如果您可以访问此引用计数,则表示您在对象上使用shared_ptr
。因此,在这种情况下,1的计数是自然的。
将发生以下情况:如果您在函数中使用本地shared_ptr
,则当函数到达其末尾时,shared_ptr
对象将被销毁。因此,该指针是对象的最后一个,当函数结束时,指向的对象将被销毁。
但是,如果指针以持久方式存储(假设:作为程序整个生命周期中存在的对象的成员),引用将始终存在,因此对象永远不会被销毁。
解决此问题的方法是定期检查引用计数,并在引用计数为1时调用reset()
。
但是:如果必须这样做,处理shared_ptr
对象的方式可能存在问题:您确定需要此参考吗?也许你应该有weak_ptr
而不是shared_ptr
?这样,weak_ptr
不会被视为对象的引用,无论weak_ptr
的目标是什么,它都会被销毁。
执行此操作时,您仍然可以在对象存在时使用weak_ptr
访问该对象,但显然,当对象被销毁时不会再访问该对象。您只需确保对象在访问之前仍然存在。这是通过在lock()
上使用weak_ptr
来完成的:它会向对象返回shared_ptr
,但如果对象不存在,则此指针可以是nullptr
更多。在执行nullptr
后,只需检查指针是否为lock()
。或者,您可以使用expired()
函数检查引用是否仍然有效。