zoukankan      html  css  js  c++  java
  • 智能指针

     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
    "; }
    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)

     

  • 相关阅读:
    爬取毛概题库
    python爬虫抓取豆瓣电影
    青蛙的约会(POJ 1061 同余方程)
    1234: ZJTZYRC筛offer(并查集 )
    A Simple Math Problem(HDU 1757 构造矩阵)
    Number Sequence(HDU 1005 构造矩阵 )
    How many ways??(HDU 2157)
    线性结构上的动态规划
    Codeforces Round #427 (Div. 2)
    Codeforces Round #426 (Div. 2)
  • 原文地址:https://www.cnblogs.com/zyj23/p/14717318.html
Copyright © 2011-2022 走看看