我是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;
}
输出
10
0
因为我使用了reset函数是从内存中删除了所有实例吗?因为,我刚刚用sp消除了任何可能的内存泄漏?显然,这是一个我很快就编造的玩具示例,如果有任何错误,请对不起。
跟进情况:
shared_ptr<SomeClass> returnThis() {
shared_ptr<SomeClass> someObject(new SomeClass(/*default constructor for example*/) );
return someObject;
}
主要是:
shared_ptr<SomeClass> mainObject;
mainObject = returnThis();
mainObject的使用次数是否为2,因为someObject是在函数中创建但从未清除过的?或者它是一个,并在返回值时自动完成清理?
答案 0 :(得分:40)
当您使用.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;
}
节目输出:
p.reset()... q.reset()... Test destroyed. done
请注意,p
和q
都是对象的所有者,重置p
和q
后,然后实例被毁了。
答案 1 :(得分:10)
不,shared_ptr的全部目的是,如果有人在另一个地方使用它,则无法从一个地方删除它。 sp.reset()只是将use_count减少一个,并用nullptr
替换它的对象。
答案 2 :(得分:1)
.reset()方法仅适用于它所调用的对象。
它只是替换了变量持有的指针。