在std :: shared_ptr上使用.reset()会删除所有实例

时间:2014-02-05 22:08:53

标签: 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;
}

输出

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是在函数中创建但从未清除过的?或者它是一个,并在返回值时自动完成清理?

3 个答案:

答案 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

请注意,pq都是对象的所有者,重置pq后,然后实例被毁了。

答案 1 :(得分:10)

不,shared_ptr的全部目的是,如果有人在另一个地方使用它,则无法从一个地方删除它。 sp.reset()只是将use_count减少一个,并用nullptr替换它的对象。

答案 2 :(得分:1)

.reset()方法仅适用于它所调用的对象。

它只是替换了变量持有的指针。