智能指针

 shared_ptr 

shared_ptr 控制对象的生命期

采用引用计数的智能指针。 shared_ptr基于“引用计数”模型实现,多个shared_ptr可指向同一个动态对象,并维护了一个共享的引用计数器,记录了引用同一对象的shared_ptr实例的数量。当最后一个指向动态对象的shared_ptr销毁时,会自动销毁其所指对象(通过delete操作符)。

weak_ptr 

结合 shared_ptr 使用的特例智能指针。 weak_ptr 提供对一个或多个 shared_ptr 实例所属对象的访问,但是,不参与引用计数。

weak_ptr 不控制对象的生命期,但是它知道对象是否还活着(想象成用棉线轻轻拴住堆上的对象) 。如果对象还活着,那么它可以提升(promote) 为有效的 shared_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\n"; }
16 
17 public:
18     children_ptr children;
19 };
20 
21 class children
22 {
23 public:
24     ~children() { std::cout <<"destroying children\n"; }
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...\n";
43     test();
44     std::cout<<"end test.\n";
45 }

 修改为:

class children
{
public:
    ~children() { std::cout <<"destroying children\n"; }
 
public:
    boost::weak_ptr<parent> parent;
};

 

弱引用能检测到所管理的对象是否已经被释放

boost::weak_ptr<T>是boost提供的一个弱引用的智能指针

boost::weak_ptr除了对所管理对象的基本访问功能(通过get()函数)外,还有两个常用的功能函数:expired()用于检测所管理的对象是否已经释放;lock()用于获取所管理的对象的强引用指针。

 

转载:weak_ptr解决shared_ptr环状引用所引起的内存泄漏[转] - Przz - 博客园 (cnblogs.com)

 

 

 

posted @ 2021-04-29 11:34  Z9Y1J5  阅读(292)  评论(0编辑  收藏  举报