首页 > 解决方案 > C++中引用计数和循环引用的概念

问题描述

我知道如何weak_ptr使用,我阅读了以下帖子:

关于“循环引用”,我使用了weak_ptr,但仍然发生内存泄漏

但是有一个概念我还不能理解。

我将根据我的理解演示shared_ptr创建和发布:


1.shared_ptr pa创建

reference_countpa应该是0。因为没有shared_ptr分到pa

{/*scope 1*/

  shared_ptr<int> pa;
  // reference_count_pa = 0
}

2.我在另一个范围内分配新shared_ptr<int> pbpa

{/*scope 1*/

  shared_ptr<int> pa;

  {/*scope 2*/

    shared_ptr<int> pb = pa;
    // reference_count_pa = 1
    // reference_count_pb = 0
  }
}

reference_countofpa应该是1因为shared_ptr pb指向pa.

reference_countpb应该是0因为没有shared_ptr分到pb

3. 现在,一个简单的Circular Reference

正如关于“循环引用”中所展示的,我使用了weak_ptr,但内存泄漏仍然发生

{/*scope 1*/

  shared_ptr<int> pa;

  {/*scope 2*/

    shared_ptr<int> pb = pa;
    pa = pb; //circular reference
    // reference_count_pa = 1
    // reference_count_pb = 1
  }
}

reference_countofpa应该是1因为shared_ptr pb指向pa

reference_countofpb应该是1因为shared_ptr pa指向pb

4. 结束时scope 2

pb被删除,因为程序走出scope 2.

reference_countofpa0现在,因为没有shared_ptr指向pa.

reference_countpb还在1

5. 结束时scope 1

reference_countpb0现在因为没有shared_ptr点到pb


上述步骤是我理解的reference_count。

pa并被pb正常删除。

我很困惑。

谁能纠正我在上述步骤中的错误?

谢谢!

标签: c++smart-pointerscircular-reference

解决方案


有人纠正我在上述步骤中的错误吗?

首先,这不是循环引用。其次,您的代码中没有任何引用计数,因为您无需int计算引用。

循环引用的形式为

struct Node {
    std::shared_ptr<Node> next;
};

int main() {
    std::shared_ptr<Node> a = std::make_shared<Node>();
    std::shared_ptr<Node> b = std::make_shared<Node>();

    a->next = b;
    b->next = a;
}

推荐阅读