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

When does std::shared_ptr release its object?

我在 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 会在解除引用期间一直存在?

std::shared_ptr 不知道您对被持有对象的引用(或者您的引用不知道 std::shared_ptr),它只知道其他 std::shared_ptr共享同一对象的所有权。因此,一旦最后一个 std::shared_ptr 超出范围,对象就会被破坏,你最终会得到一个悬空引用。

但是,这里不应该是这种情况,您的 std::shared_ptr 应该在程序流离开其范围后被正确销毁,我不明白这是怎么发生的,可能会在调用 [=15 之前发生=].

任何由 std::shared_ptr 管理的东西都将在没有 std::shared_ptr 提出主张的那一刻被销毁,所有其他引用它的方式都是无关紧要的。

并且局部变量只有在离开各自的作用域时才会被销毁。取消引用 std::shared_ptr 不会以任何方式修改它。

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