面试的时候碰到过这样一个问题: 定义两个类, 每个类中又包含一个指向对方类型的智能指针作为成员变量, 然后创建对象, 这样会出现什么问题?
当时还不知道share_ptr的引用成环问题, 所以也没想到怎么去做, 惭愧…… 后面面试官提示是用weak_ptr去解决, 特此记录一下~ 若定义了这样两个类,
class B;
class A
{
public:
void set_ptr(shared_ptr<B>& ptr) { ptr_b = ptr; }
private:
shared_ptr<B> ptr_B;
};
class B
{
public:
void set_ptr(shared_ptr<A>& ptr) { ptr_a = ptr; }
private:
shared_ptr<A> ptr_A;
};
然后分别创建对象,
int main(){
A a;
B b;
share_ptr<A> ptr_a(a);
share_ptr<B> ptr_b(b);
ptr_a->set_ptr(ptr_b);
ptr_b->set_ptr(ptr_a);
return 0;
}
这样出来的结果会出现a和b两个对象都无法被析构的问题, 主要是因为其引用计数都无法减为0, 详细地可以看一下这篇博客: https://blog.csdn.net/weixin_36750623/article/details/84831969.