内容: c++11后,我们有了新的智能指针可以使用,我们可以抛弃auto,而使用新的智能指针,其中shared_ptr指针在正常使用是没有问题的,但是如果shared_ptr出现互相引用的时候,那么就会出现循环引用,从而导致资源没有办法正确释放。
测试代码:
测试结果:
分析:当pa,pb构造时,他们的引用计数为1,接下来由于循环引用,导致两者的引用计数为2,离开作用域后,引用计数都为1,因此不释放资源。这就是循环引用导致的后果。
解决方法: 利用weak_ptr就可以解决循环引用的问题,因为weak_ptr是弱引用型指针,是用来监视shared_ptr的,不会使引用计数增加,但是它不管理shared_ptr内部的指针,也就是数据指针,它是用来监视shared_ptr生命周期的,通过它的构造不增加引用计数,析构不减少引用计数这一点,从而解决了循环引用的问题。
测试代码:
结果:
结果分析:首先创建的时候双方的引用计数为1,接着pb赋值给pa->bptr这个会使pb的引用计数加1,此时为2,pa仍为1,接着pa赋值给pb->aptr这个由于是weak_ptr指针的构造,不会使它的引用计数加1,pa的引用计数为1,pb的引用计数为2,离开作用域后,pa计数为0,析构,pb计数为2-1=1,不析构,但是由于pa析构,pa中的bptr会析构,那么引用计数减1,这时候pb引用计数为1-1=0,也析构。实现资源的完整释放。