zeu*_*unk 26 c++ memory memory-leaks shared-memory shared-ptr
我是shared_ptr的新手,我正试图弄清楚.reset()函数的确切功能.
#include <memory>
#include <stdio>
using namespace std;
class SomeClass{};
int main()
{
shared_ptr<SomeClass> sp (nullptr);
//do some stuff, sp now has 10 co-owners
cout << sp.use_count << endl;
sp.reset();
cout << sp.use_count << endl;
return 0;
}
Run Code Online (Sandbox Code Playgroud)
会输出
10
0
Run Code Online (Sandbox Code Playgroud)
因为我使用了reset函数是从内存中删除了所有实例吗?因为,我刚刚用sp消除了任何可能的内存泄漏?显然,这是一个我快速编写的玩具示例,对不起,如果有任何错误.
跟进情况:
shared_ptr<SomeClass> returnThis() {
shared_ptr<SomeClass> someObject(new SomeClass(/*default constructor for example*/) );
return someObject;
}
Run Code Online (Sandbox Code Playgroud)
在主要的地方:
shared_ptr<SomeClass> mainObject;
mainObject = returnThis();
Run Code Online (Sandbox Code Playgroud)
mainObject的使用次数是否为2,因为someObject是在函数中创建但从未清除过的?或者它是一个,并在返回值时自动完成清理?
Die*_*Epp 44
当您使用时.reset()
,您正在消除指针的一个所有者,但所有其他所有者仍然存在.这是一个例子:
#include <memory>
#include <cstdio>
class Test { public: ~Test() { std::puts("Test destroyed."); } };
int main()
{
std::shared_ptr<Test> p = std::make_shared<Test>();
std::shared_ptr<Test> q = p;
std::puts("p.reset()...");
p.reset();
std::puts("q.reset()...");
q.reset();
std::puts("done");
return 0;
}
Run Code Online (Sandbox Code Playgroud)
程序输出:
p.reset()... q.reset()... Test destroyed. done
需要注意的是p
和q
是对象的两个业主,一旦双方p
和q
复位,则实例被销毁.
Ale*_*hev 12
不,shared_ptr的全部目的是,如果有人在另一个地方使用它,你就不能从一个地方删除它.sp.reset()只是将use_count减少一个并将其对象替换为nullptr
.
归档时间: |
|
查看次数: |
30102 次 |
最近记录: |