use_cout()== 1

时间:2015-05-26 09:51:56

标签: c++ shared-ptr

我目前有一个shared_ptr,其use_count()为1,因此我希望自动销毁shared_ptr(无需调用reset())但是这样没有发生。

我的问题是我在这里遗漏了什么吗?是否存在导致shared_ptr不被销毁的任何情况?

我的一些类是GUI类,它们不包含构造函数或析构函数,并且具有Init()和Shutdown()函数。对于这种类型的类,shared_ptr似乎不会被自动销毁。

谢谢,

1 个答案:

答案 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()函数检查引用是否仍然有效。