• 对象管理Boost智能指针——shared_ptr


    PS:今天上午,非常郁闷,有很多简略基础的问题搞得我有些迷茫,哎,码代几天不写就忘。目前又不当COO,还是得用心记码代哦!

        boost::scoped_ptr虽然简略易用,但它不能享共全部权的性特却大大制限了其用使范围,而boost::shared_ptr可以处理这一范围。义思名顾,boost::shared_ptr是可以享共全部权的智能指针,首先让我们通过一个例子看看它的基本用法:

        #include <string>
    #include <iostream>
    #include <boost/shared_ptr.hpp>

    class implementation
    {
    public:
        ~implementation() { std::cout <<"destroying implementation\n"; }
        void do_something() { std::cout << "did something\n"; }
    };

    void test()
    {
        boost::shared_ptr<implementation> sp1(new implementation());
        std::cout<<"The Sample now has "<<sp1.use_count()<<" references\n";

        boost::shared_ptr<implementation> sp2 = sp1;
        std::cout<<"The Sample now has "<<sp2.use_count()<<" references\n";
        
        sp1.reset();
        std::cout<<"After Reset sp1. The Sample now has "<<sp2.use_count()<<" references\n";

        sp2.reset();
        std::cout<<"After Reset sp2.\n";
    }

    void main()
    {
        test();
    }

        该序程的输出结果如下:

        The Sample now has 1 references
    The Sample now has 2 references
    After Reset sp1. The Sample now has 1 references
    destroying implementation
    After Reset sp2.

        每日一道理
    人生是洁白的画纸,我们每个人就是手握各色笔的画师;人生也是一条看不到尽头的长路,我们每个人则是人生道路的远足者;人生还像是一块神奇的土地,我们每个人则是手握农具的耕耘者;但人生更像一本难懂的书,我们每个人则是孜孜不倦的读书郎。

        可以看到,boost::shared_ptr指针sp1和sp2同时具有了implementation对象的问访权限,且当sp1和sp2都放释对该对象的全部权时,其所管理的的对象的内存才被主动放释。在享共对象的问访权限同时,也现实了其内存的主动管理。

        boost::shared_ptr的内存管理机制:

        boost::shared_ptr的管理机制其实其实不庞杂,就是对所管理的对象停止了用引计数,当新增一个boost::shared_ptr对该对象停止管理时,就将该对象的用引计数加一;少减一个boost::shared_ptr对该对象停止管理时,就将该对象的用引计数减一,如果该对象的用引计数为0的时候,说明没有任何指针对其管理,才调用delete放释其所占的内存。

        面上的那个例子可以的图示如下:

        

    1. sp1对implementation对象停止管理,其用引计数为1 
    2. 加增sp2对implementation对象停止管理,其用引计数加增为2 
    3. sp1放释对implementation对象停止管理,其用引计数为变1 
    4. sp2放释对implementation对象停止管理,其用引计数为变0,该对象被主动删除 

        boost::shared_ptr的点特:

        和面前分析的boost::scoped_ptr比拟,boost::shared_ptr可以享共对象的全部权,因此其用使范围基本上没有什么制限(还是有一些须要遵守的用使规矩,下文中分析),然自也可以用使在stl的容器中。另外它还是线程安全的,这点在多线程序程中也非常重要。

        boost::shared_ptr的用使规矩:

        boost::shared_ptr其实不是绝对安全,面下几条规矩能使我们更加安全的用使boost::shared_ptr:

        

    1. 免避对shared_ptr所管理的对象的直接内存管理操纵,以免形成该对象的重放释
    2. shared_ptr其实不能对循环用引的对象内存主动管理(这点是其它各种用引计数管理内存式方的通病)。
    3. 不要造构一个临时的shared_ptr作为数函的参数。
      如下列码代则可能致使内存泄漏:
      void test()
      {
          foo(boost::shared_ptr<implementation>(new    implementation()),g());
      }
      确正的用法

      void test()
      {
          boost::shared_ptr<implementation> sp    (new implementation());
          foo(sp,g());
      }

    文章结束给大家分享下程序员的一些笑话语录: 苹果与谷歌之争就是封闭收费与自由免费思想之争。(别急着把google来膜拜哦?那可是一家公司,以赚钱为目标的公司!当年我Party就是这样把广大劳动人民吸引过来的。今天的结果你们都看到了。)

  • 相关阅读:
    Lucene教程
    ElasticSearch安装
    MySQL事务
    Java泛型
    Python学习笔记(1)
    @keyframs实现图片gif效果
    glup简单应用---gulpfile.js
    巧用CSS3伪类选择器自定义checkbox和radio的样式
    get传中文参数乱码解决方法
    自定义样式 实现文件控件input[type='file']
  • 原文地址:https://www.cnblogs.com/xinyuyuanm/p/3065752.html
Copyright © 2020-2023  润新知