对象管理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就是这样把广大劳动人民吸引过来的。今天的结果你们都看到了。)

原文地址:https://www.cnblogs.com/xinyuyuanm/p/3065752.html