gpt4 book ai didi

c++ - shared_ptr、weak_ptr 和循环依赖

转载 作者:太空宇宙 更新时间:2023-11-04 11:41:47 25 4
gpt4 key购买 nike

我认为我的问题类似于 shared_ptr and weak_ptr differences ,但我感兴趣的是了解它们如何协同工作,而不是查看差异列表。

维基百科页面 shared_ptr and weak_ptr声明一个weak_pointer可以用来解决循环依赖问题,并给出了一个例子:

std::shared_ptr<int> p1(new int(5));
std::weak_ptr<int> wp1 = p1; //p1 owns the memory.

{
std::shared_ptr<int> p2 = wp1.lock(); //Now p1 and p2 own the memory.
if(p2) //Always check to see if the memory still exists
{
//Do something with p2
}
} //p2 is destroyed. Memory is owned by p1.

p1.reset(); //Memory is deleted.

std::shared_ptr<int> p3 = wp1.lock(); //Memory is gone, so we get an empty shared_ptr.
if(p3)
{
//Will not execute this.
}

但是我没有看到循环依赖,所以我不明白weak_pointer是如何解决问题的。

我希望看到一些对象 a 指向对象 b,而 b 以某种方式指向 a(使用 weak_ptr 在有向图边之一之间填充以打断链)。

是不是榜样好,我的思路不好?或者是否有更好的问题和解决方案示例?

最佳答案

在维基百科页面的当前版本中,该示例旨在演示 std::weak_ptr 的一般用法,而不是特别消除强循环引用。 (循环引用仅在示例出现后被提及。)

这个例子表明 wp1,尽管它的生命周期,并不拥有 p1 指向的内存,并且 wp1一旦 p1 被重置,就会正确检测到该内存的删除。换句话说,wp1 既不会干扰动态分配对象的删除,也不会在通过弱指针(正确)访问已删除对象时导致未定义的行为。

因为它们不干扰释放,弱指针不仅可用于避免引用循环,而且可用于实现存储附加属性或缓存现有对象的计算属性的关联数组。由于此类缓存不会干扰释放,因此它们可以依靠不再使用时删除的主要对象,而无需特定于缓存的逐出策略。

关于c++ - shared_ptr、weak_ptr 和循环依赖,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21089421/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com