什么时候std :: shared_ptr释放它的对象?

时间:2015-11-19 19:29:28

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

我在Ubuntu 14.04上使用GCC 4.8.4,我的代码类似于以下内容:

std::shared_ptr<MyClass> my_shared_object = set elsewhere...
MyFunction(*my_shared_object);

MyFunction的签名如下所示:

void MyFunction(const MyClass& my_object)

可以找到完整的代码here

但是,我发现my_object实际上超出了MyFunction范围内的范围。我的想法是my_shared_object只有在超出范围后才会释放其内容,这意味着在MyFunction返回后。我不确定我是误解std::shared_ptr还是这可能是GCC的错误。

我想这个问题归结为:当我取消引用std :: shared_ptr时,这是否可以保证std::shared_ptr只要使用取消引用就会持续存在?

3 个答案:

答案 0 :(得分:5)

std::shared_ptr管理的任何内容都会在没有std::shared_ptr声明声明的那一刻被破坏,所有其他引用它的方式都无关紧要。

局部变量只有在离开相应的范围时才会被销毁。取消引用std::shared_ptr不会以任何方式修改它。

答案 1 :(得分:4)

std::shared_ptr并不了解您的参考资料(或者您的参考资料不了解std::shared_ptr)所持有的对象,它只知道其他对象std::shared_ptr共享同一对象的所有权。因此,只要最后一个std::shared_ptr超出范围,对象就会被破坏,最终会有一个悬空参考。

但是,这不应该是这种情况,并且在程序流程离开其范围后,std::shared_ptr应该被正确销毁,我不明白如何在调用{{1 }}

答案 2 :(得分:1)

std :: shared_ptr维护内部引用计数。此计数对应于共享对象的对象数。 每当shared_ptr超出范围时,内部引用计数就会递减。 当内部引用计数降为零时,将取消分配内存。