我在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)
完整的代码可以在这里找到
然而,我发现my_object实际上超出了MyFunction
的范围。我的想法是,my_shared_object
只有在超出范围时才会发布其内容,也就是说在MyFunction
返回之后。我不确定我是否误解了std::shared_ptr
,或者这是否是GCC错误。
我想问题可以归结为:当我取消引用std::shared_ptr时,这是否保证std::shared_ptr
在使用取消引用时会一直存在
由std::shared_ptr
管理的任何内容都将在没有std::shared_ptr
断言声明的时候被销毁,所有其他引用它的方式都无关紧要。
局部变量只有在离开各自的作用域时才会被销毁。取消引用std::shared_ptr
不会以任何方式对其进行修改。
std::shared_ptr
不知道您对所持有对象的引用(或您的引用不知道std::shared_ptr
),它只知道其他std::shared_ptr
共享同一对象的所有权。因此,一旦最后一个std::shared_ptr
超出作用域,对象就会被销毁,并且您最终会得到一个悬空引用。
然而,这里不应该是这种情况,并且在程序流离开其作用域之后,std::shared_ptr
应该被正确地销毁,我不明白这是如何在调用MyFunction
之前发生的。
std::shared_ptr维护一个内部引用计数。此计数对应于共享对象的对象数。每当shared_ptr超出范围时,内部引用计数就会递减。当内部引用计数降至零时,内存将被取消分配。