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

C++ C+中关于引用计数和循环引用的概念+;,c++,smart-pointers,circular-reference,C++,Smart Pointers,Circular Reference,我知道如何使用弱ptr,我读了以下帖子: 但有一个概念我还不明白 根据我的理解,我将演示创建和发布的共享\u ptr: 1. 共享\u ptrpa已创建 pa的reference\u计数应为0。 因为noshared\u ptr指向pa {/*范围1*/ 共享ptr pa; //参考计数=0 } 2.我将新的shared_ptrpb分配给另一个作用域中的pa pa的reference\u count应该是1,因为shared\u ptrpb指向pa pb的reference\u count

我知道如何使用
弱ptr
,我读了以下帖子:

但有一个概念我还不明白

根据我的理解,我将演示创建和发布的
共享\u ptr


1. <代码>共享\u ptr
pa
已创建
pa
reference\u计数应为
0
。 因为no
shared\u ptr
指向
pa

{/*范围1*/
共享ptr pa;
//参考计数=0
}
2.我将新的
shared_ptr
pb
分配给另一个作用域中的
pa
pa
reference\u count
应该是
1
,因为
shared\u ptr
pb
指向
pa

pb
reference\u count
应该是
1
,因为
shared\u ptr
pa
指向
pb

4.在范围2的末尾
pb
被删除,因为程序退出了
范围2

pa
reference\u count
现在是
0
,因为没有
shared\u ptr
指向
pa

pb
reference\u计数仍然是
1

5.在
范围1的末尾
pb
reference\u count
现在是
0
,因为没有
shared\u ptr
指向
pb


根据我的理解,以上步骤是参考计数

pa
pb
正在正常删除

我很困惑

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

谢谢

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

首先,这不是循环引用。其次,代码中没有任何引用计数,因为您没有
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;
}
struct节点{
std::共享\u ptr next;
};
int main(){
std::shared_ptr a=std::make_shared();
std::shared_ptr b=std::make_shared();
a->next=b;
b->next=a;
}

您的意思是在编写
引用\u count
时使用
计数吗?后者无法在cpp参考中找到

答案是
shared\u ptr
统计指向同一对象(pointee)的所有(这一个和其他)托管指针的数量。因此,指向同一对象的所有托管指针将返回相同的
use\u count
。(这是你的结论2。)

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

请阅读本手册。在这里您可以找到有关使用计数的说明:

long use_count() const noexcept;

返回管理当前对象的不同共享\u ptr实例(包括)的数量。如果没有托管对象,​0​ 返回。

那里没有循环引用。此外,您实际上没有在任何地方分配内存,因此引用计数在任何地方都为零。引用计数告诉您有多少
shared\u ptr
s在共享一个对象。
shared\u ptr pb=pa;
并不意味着
pb
指向
pa
,但两者都e> pb
pa
共享相同的
int
,使引用计数为2。您可以检查
pa。使用\u count()
pb。使用\u count()
查看您自己的引用计数应该是“有很多”“这里假设您可能需要几分钟来验证。嗨,Kerndog73:我忘了使用
std::make_shared
谢谢!我明白什么是循环参考
now
a->next=a甚至是更短的周期;-)@Jarod42确实如此
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;
}
long use_count() const noexcept;