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