C++中引用计数和循环引用的概念

Concept about Reference Count and Circular Reference in C++

我知道weak_ptr是怎么用的,我看了下面的post:

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

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


1。 shared_ptr pa 创建

pa

reference_count 应该是 0。 因为没有 shared_ptr 指向 pa .

{/*scope 1*/

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

2。我在另一个范围

中将新的 shared_ptr<int> pb 分配给 pa
{/*scope 1*/

  shared_ptr<int> pa;

  {/*scope 2*/

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

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

pb

reference_count 应该是 0 因为没有 shared_ptr 指向 pb .

3。现在,一个简单的 Circular Reference:

所示:

{/*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
  }
}
pa

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

pb

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

4。最后scope 2

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

pa

reference_count 现在是 0,因为没有 shared_ptr 指向 pa .

pb

reference_count 仍然是 1

5。最后scope 1

pb

reference_count 现在是 0 因为没有 shared_ptr 指向 pb .


以上步骤是我理解的reference_count

papb 正在正常删除。

我很困惑。

任何人都可以纠正我在上述步骤中的错误吗?

谢谢!

Does anyone correct my error in above step ?

首先,这不是循环引用。其次,您的代码中没有任何引用计数,因为您没有 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;
}

你写reference_count的时候是指use_count吗?后者在 cpp-reference 中找不到。

答案是 shared_ptr 计算指向同一个对象(指针对象)的所有(这个和其他)托管指针的数量。因此,指向同一对象的所有托管指针将 return 相同 use_count。 (这解决了您对 2 的结论。)。

3 中的 "circular" 引用不是循环引用,而是两个指向任何内容的共享指针。我建议 std::make_shared> 创建一个(托管)对象,该对象被共享管理指针。顺便说一句,周指针指向一个知道该对象存在的托管对象。

请阅读手册,https://en.cppreference.com/w/cpp/memory/shared_ptr。在这里您可以找到 use_count:

的描述
long use_count() const noexcept;

Returns 管理当前对象的不同 shared_ptr 个实例(包括在内)的数量。如果没有托管对象, 0 是 returned.