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)
完整的代码可以在这里找到
然而,我发现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超出范围时,内部引用计数就会递减。当内部引用计数降至零时,内存将被取消分配。
- COM :是否可以查看是否存在对我的某个 COM 对象的进程外引用?我可以释放它吗?
- 错误:malloc:对象 0x7f9edf504080 的 *** 错误:未分配正在释放的指针
- 在Qt中执行完所有插槽后,如何释放对象
- 我是否需要在向量中释放对象指针
- 直接在C++中释放对象
- OpenSSL Stack API - 推送到堆栈后释放对象
- 未正确的校验和释放对象 - 打印时错误
- 从派生类中释放对象的位置
- 调用 std::函数对象,指向释放对象的方法
- 释放对象的校验和不正确
- 在一对向量内释放对象的内存
- 如何在 c# 上创建的 c++ 上释放对象
- 通过使用不同的构造函数创建对象,并最终释放对象的内存
- 我们什么时候在使用Connector/c++的代码中释放对象?
- 将可释放对象封装到智能指针中
- c++中获取所有权和释放对象的语法指南
- 为什么在c++中释放对象的指针类型时需要p=NULL ?
- 试图释放对象指针的向量时崩溃
- 释放对象的错误校验和与将多维向量传递给c++中的静态函数有关
- 在大输入时释放对象的校验和错误