我在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
只要使用取消引用就会持续存在?
答案 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超出范围时,内部引用计数就会递减。 当内部引用计数降为零时,将取消分配内存。