C++ 智能指针 循环引用以及解决方案

今天面试碰到这个问题了,结果自己没有搞清楚是个是么问题。感觉面试官说的也不太清楚。。我理解成两个两个智能指针A = B B = A,A = B,这种了。。。我还说这种不会引计数器多++。。尴尬。。自己基础方面还是有点问题。。

循环引用如下

#include<bits/stdc++.h>

using namespace std;
class B;
class A{
    
    
public:
    shared_ptr<B> ptr_b;
};
class B{
    
    
public:
    shared_ptr<A> ptr_a;
};

weak_ptr<A> show(){
    
    
    shared_ptr<A> ptr_A = make_shared<A>();
    shared_ptr<B> ptr_B = make_shared<B>();
    ptr_A->ptr_b = ptr_B;
    ptr_B->ptr_a = ptr_A;

    return ptr_A;
}
int main(void){
    
    
    weak_ptr<A> weak = show();
    shared_ptr<A> ptr = weak.lock();
    cout << ptr.use_count() << endl;
    return 0;
}

这里最后输出结果是2.所以很现实发生了内存泄露。导致这个的原因很容易分析,当ptr_A释放的时候,A指针的计数器变为1.但指向的那块内存并没有释放,所以B指针的计数器依然为2,这时ptr_B释放的时候,B指针的计数器变为1,。所以两块内存都没有被释放。
下面这种情况也会引发这个问题。

#include<bits/stdc++.h>

using namespace std;
class C{
    
    
public:
    shared_ptr<C> ptr_c;
};
weak_ptr<C> show(){
    
    
    shared_ptr<C> ptr = make_shared<C>();
    ptr->ptr_c = ptr;
    return ptr;
}
int main(void){
    
    
    weak_ptr<C> weak = show();
    shared_ptr<C> ptr = weak.lock();
    cout << ptr.use_count() << endl;

    return 0;
}

输出也是2.主要就是计数器不变为0,智能指针不会销毁这块内存。

解决方案就是使用弱智能指针了。这种指针不会增加智能指针的计数,而且也可以获得对象。

class B;
class A{
    
    
public:
    weak_ptr<B> weak_b;
};
class B{
    
    
public:
    weak_ptr<A> weak_a;
};

猜你喜欢

转载自blog.csdn.net/zhao5502169/article/details/99679765