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
pa
和 pb
正在正常删除。
我很困惑。
任何人都可以纠正我在上述步骤中的错误吗?
谢谢!
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.
我知道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
pa
和 pb
正在正常删除。
我很困惑。
任何人都可以纠正我在上述步骤中的错误吗?
谢谢!
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.