可能一般情况下并不会写出上面这样的代码,但是下面这种代码与上面的代码同样,如下:
1: class tester 2: { 3: public: 4: tester() {} 5: ~tester() {} 6: public: 7: boost::shared_ptr
情况是一样的。要解决这类问题的办法也很简单,使用boost.weak_ptr就可以很方便解决这个问题。第一种情况修改代码如下:
1: class tester 2: { 3: public: 4: tester() {} 5: ~tester() {} 6: // 更多的函数定义… 7: }; 8: void fun(boost::weak_ptr
boost.weak_ptr指针功能一点都不weak,weak_ptr是一种可构造、可赋值以不增加引用计数来管理shared_ptr的指针,它可以方便的转回到shared_ptr指针,使用weak_ptr.lock函数就可以得到一个shared_ptr的指针,如果该指针已经被其它地方释放,它则返回一个空的shared_ptr,也可以使用weak_ptr.expired()来判断一个指针是否被释放。
boost.weak_ptr不仅可以解决多线程访问带来的安全问题,而且还可以解决上面第三个问题循环引用。Children类代码修改如下,即可打破循环引用:
1: class child 2: { 3: public: 4: ~child() { 5: std::cout <<"子类析构函数被调用.\n"; 6: } 7: public: 8: boost::weak_ptr
因为boost::weak_ptr不增加引用计数,所以可以在退出函数域时,正确的析构。