相信大家在很多八股文中都看过shared_ptr会引起相互引用的风险,但是究竟相互引用后是不是没有释放我们可能不太清楚,然而weak_ptr的使用就可以解决这个问题,并且让我们认识到是不是真的没有释放
1.相互引用的最简单实例
class B;
class A {
public:
shared_ptr<B>m_b;
};
class B {
public:
shared_ptr<A>m_a;
};
先建立一个最简单的相互引用实例,即A中含有一个指向B的智能指针,B中含有一个指向A的智能指针,稍后在主程序中建立一个指向实例化A的对象智能指针,让其中指向B的指针指向B的实例化对象,B同理,这样就建立了一个相互引用模型。
shared_ptr<A>a(new A);
shared_ptr<B>b(new B);
a->m_b = b;
b->m_a = a;
2.用shared_ptr初始化weak_ptr,分别查看引用数目
完整主程序代码:
int main() {
std::weak_ptr<B>wp; //建立weak_ptr
std::weak_ptr<A>wa;
while (true) {
shared_ptr<A>a(new A);
shared_ptr<B>b(new B);
a->m_b = b;
b->m_a = a;
wp = b; //用shared_ptr初始化weak_ptr
wa = a;
cout << a.use_count() << endl;
cout << b.use_count() << endl;
break;
}
cout << wp.use_count() << endl;
cout << wa.use_count()<< endl;
}
完整代码运行时,代码段while循环内的引用计数都会输出2,代表着有相互引用的存在,当代码段结束后,理论上两个对象都应该被释放了,但当用weak_ptr再输出引用计数时,却还能读到引用计数为1,代表着发生了内存泄漏。