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
。
因为noshared\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
谢谢!我明白什么是循环参考
nowa->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;