shared_ptr
shared_ptr 控制对象的生命期
采用引用计数的智能指针。 shared_ptr基于“引用计数”模型实现,多个shared_ptr可指向同一个动态对象,并维护了一个共享的引用计数器,记录了引用同一对象的shared_ptr实例的数量。当最后一个指向动态对象的shared_ptr销毁时,会自动销毁其所指对象(通过delete操作符)。
weak_ptr
结合 shared_ptr 使用的特例智能指针。 weak_ptr 提供对一个或多个 shared_ptr 实例所属对象的访问,但是,不参与引用计数。
weak_ptr用于配合shared_ptr使用,并不影响动态对象的生命周期,即其存在与否并不影响对象的引用计数器。weak_ptr并没有重载operator->和operator *操作符,因此不可直接通过weak_ptr使用对象。提供了expired()与lock()成员函数,前者用于判断weak_ptr指向的对象是否已被销毁,后者返回其所指对象的shared_ptr智能指针(对象销毁时返回”空“shared_ptr)。循环引用的场景:如二叉树中父节点与子节点的循环引用,容器与元素之间的循环引用等。
weak_ptr解决shared_ptr环状引用所引起的内存泄漏
1 #include<string> 2 #include <iostream> 3 #include <boost/shared_ptr.hpp> 4 #include <boost/weak_ptr.hpp> 5 6 class parent; 7 class children; 8 9 typedef boost::shared_ptr<parent> parent_ptr; 10 typedef boost::shared_ptr<children> children_ptr; 11 12 class parent 13 { 14 public: 15 ~parent() { std::cout <<"destroying parent "; } 16 17 public: 18 children_ptr children; 19 }; 20 21 class children 22 { 23 public: 24 ~children() { std::cout <<"destroying children "; } 25 26 public: 27 parent_ptr parent; 28 }; 29 30 31 void test() 32 { 33 parent_ptr father(new parent()); //会包含儿子指针 34 children_ptr son(new children); //会包含父亲指针 35 36 father->children = son; 37 son->parent = father; 38 } 39 40 void main() 41 { 42 std::cout<<"begin test... "; 43 test(); 44 std::cout<<"end test. "; 45 }
修改为:
class children { public: ~children() { std::cout <<"destroying children "; } public: boost::weak_ptr<parent> parent; };
弱引用能检测到所管理的对象是否已经被释放
boost::weak_ptr<T>是boost提供的一个弱引用的智能指针
boost::weak_ptr除了对所管理对象的基本访问功能(通过get()函数)外,还有两个常用的功能函数:expired()用于检测所管理的对象是否已经释放;lock()用于获取所管理的对象的强引用指针。
转载:weak_ptr解决shared_ptr环状引用所引起的内存泄漏[转] - Przz - 博客园 (cnblogs.com)