5

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

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

WhereMyFunction的签名如下所示:

void MyFunction(const MyClass& my_object)

完整的代码可以在这里找到

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

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

4

3 回答 3

6

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

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

于 2015-11-19T19:34:32.660 回答
4

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

但是,这里不应该是这种情况,并且您std::shared_ptr应该在程序流离开其范围后被正确破坏,我不明白这可能发生在调用MyFunction.

于 2015-11-19T19:34:01.753 回答
1

std::shared_ptr 维护一个内部引用计数。此计数对应于共享对象的对象数。每次 shared_ptr 超出范围时,内部引用计数都会减少。当内部引用计数降为零时,内存被释放。

于 2015-11-19T19:39:58.537 回答