std::shared_ptr何时释放其对象

When does std::shared_ptr release its object?

本文关键字:释放 对象 何时 ptr shared std      更新时间:2023-10-16

我在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超出范围时,内部引用计数就会递减。当内部引用计数降至零时,内存将被取消分配。