Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/140.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/google-maps/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 弱指针.lock()是否会增加用于创建弱指针的原始共享指针的引用计数_C++_Weak Ptr - Fatal编程技术网

C++ 弱指针.lock()是否会增加用于创建弱指针的原始共享指针的引用计数

C++ 弱指针.lock()是否会增加用于创建弱指针的原始共享指针的引用计数,c++,weak-ptr,C++,Weak Ptr,根据我的理解,弱指针用于循环依赖,如果我们使用所有共享的_ptr对象,并且存在循环依赖,则会出现循环依赖问题。弱指针用于中断循环。弱指针通过使用lock()来实现这一点,lock()将创建共享指针 class A { shared_ptr<B> b; ... }; class B { weak_ptr<A> a; ... }; shared_ptr<A> x(new A); // +1 x->b = new B; // +1 x-

根据我的理解,弱指针用于循环依赖,如果我们使用所有共享的_ptr对象,并且存在循环依赖,则会出现循环依赖问题。弱指针用于中断循环。弱指针通过使用lock()来实现这一点,lock()将创建共享指针

class A { shared_ptr<B> b; ... };
class B { weak_ptr<A>   a; ... };
shared_ptr<A> x(new A); // +1
x->b = new B;           // +1
x->b->a = x;            // No +1 here
class A{shared\ptr b;…};
B类{弱ptr a;…};
共享_ptr x(新A);//+1.
x->b=新b;//+1.
x->b->a=x;//这里没有+1
但现在假设我创建了调用x->b->a.lock()的锁,所以x的ref count将变为2。如果x离开作用域,仍然会有内存泄漏,对吗?因为我使用lock()创建了一个共享指针,ref count变成了2。请让我知道我的理解是否正确。

共享对象涉及两个不同的引用计数:

  • 对对象的引用数,即
    共享\u ptr
    实例
  • 控制块的引用数,即
    共享\u ptr
    弱\u ptr
    实例
一个
弱\u ptr
只对后一个计数起作用。当所有
共享\u ptr
实例都已销毁时,将调用对象删除器,该删除器通常是销毁对象的默认删除器。如果存在弱指针,则控制块仍然存在。当所有弱指针也被销毁时,控制块也被销毁


因此(忽略直接在每个
shared_ptr
实例中缓存对象指针的可能优化),在您的情况下,
x
指向(为您隐藏)控制块,该控制块有一个指向
a
实例的指针。这个实例的
b
成员指向第二个控制块,它有一个指向
b
实例的指针。最后,该实例有一个指向
x
指向的控制块的指针,它是循环的yes,但不是所有权的循环。

lock()
创建的对象被其析构函数销毁时,它会再次递减计数。您如何处理
lock()
的返回值?如果忽略它,锁会立即再次被移除。一个公平的例子会告诉你发生了什么。锁()在您使用时变得毫无价值。@WhozCraig:谢谢WhozCraig。假设我试图使用lock()返回的指针访问某个成员变量。在函数结束时,是先移除锁,还是操作系统尝试释放共享_ptr(x)指向的内存。如果操作系统试图释放shared_ptr(x)指向的内存,则会发生内存泄漏。但是如何确保先移除锁从
lock()
返回的临时共享指针将立即被释放,因此引用计数将返回到其原始值。如果您想将代码扩展到另一个问题,则必须在问题本身中进行扩展。对于编写的代码,我不确定我是否理解您现在的问题。(这对我来说不是第一次)。智能指针保留指向它们指向的对象的指针不是优化,而是定义