【问题标题】:Does using .reset() on a std::shared_ptr delete all instances在 std::shared_ptr 上使用 .reset() 是否会删除所有实例
【发布时间】:2014-03-02 14:42:22
【问题描述】:

我是 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

所以自从我使用了重置功能后,所有实例都从内存中删除了吗?如,我刚刚用 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 是在函数中创建的,但从未被清除?或者是一个并且在返回值时自动完成清理?

【问题讨论】:

  • 哎呀!如果您想提出后续问题,请使用页面顶部的“”按钮。简而言之,shared_ptr 的存在是为了自动处理所有这些事情,所以当 last 共享指针离开作用域时,对象就会被销毁。

标签: c++ memory memory-leaks shared-memory shared-ptr


【解决方案1】:

没有。

shared_ptr 的全部目的是,如果有人在另一个地方使用它,你就不能从一个地方删除它。 shared_ptr::reset() 只是将use_count 减一,并将其​​对象替换为nullptr

【讨论】:

    【解决方案2】:

    当您使用.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()... 测试被破坏。 完毕

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

    【讨论】:

    • 感谢您的回答!作为后续问题,假设我有一个返回类型为 std::shared_ptr 的函数,但我返回的 shared_ptr 是在该函数内部创建的,返回 shared_ptr 是否会自动将其 use_count 减 1?我将在上面发布一个后续示例。
    【解决方案3】:

    .reset() 方法只适用于它被调用的对象。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-10-04
      • 2017-07-29
      • 1970-01-01
      • 2018-09-08
      • 2015-07-08
      • 2014-09-08
      • 2016-01-03
      • 2012-11-17
      相关资源
      最近更新 更多