C/C++之智能指针shared_ptr

1、定义

shared_ptr的作用有如同指针,但会记录有多少个shared_ptrs共同指向一个对象。这便是所谓的引用计数(reference counting)。一旦最后一个这样的指针被销毁,也就是一旦某个对象的引用计数变为0,这个对象会被自动删除。这在非环形数据结构中防止资源泄露很有帮助。

auto_ptr由于它的破坏性复制语义,无法满足标准容器对元素的要求,因而不能放在标准容器中;如果我们希望当容器析构时能自动把它容纳的指针元素所指的对象删除时,通常采用一些间接的方式来实现,显得比较繁琐。boost库中提供了一种新型的智能指针shared_ptr,它解决了在多个指针间共享对象所有权的问题,同时也满足容器对元素的要求,因而可以安全地放入容器中。

2、shared_ptr用法

示例一:

#include "boost/shared_ptr.hpp"
#include <vector>
#include <iostream>

class A
{
public:
    virtual void sing()=0;

protected:
    virtual ~A()
    {
        std::cout << "~deconstruct A" << std::endl;
    }

};

class B : public A
{
public:
    void sing()
    {
        std::cout << "Do re mi fa so la" << std::endl;
    }

    ~B()
    {
        std::cout << "~deconstruct B" << std::endl;
    }
};

boost::shared_ptr<A> createA()
{
    boost::shared_ptr<A> p(new B());
    return p;
}

int main()
{
    typedef std::vector<boost::shared_ptr<A> > container_type;
    typedef container_type::iterator iterator;
    container_type container;
    for (int i=0; i<5; ++i)
    {
        container.push_back(createA());
    }

    std::cout << "The choir is gathered: \n";
    iterator end=container.end();
    for (iterator it=container.begin();it!=end;++it)
    {
        (*it)->sing();
    }
}

这里有两个类, A和 B, 各有一个虚拟成员函数 sing. B从 A公有继承而来,并且如你所见,工厂函数 createA返回一个动态分配的B的实例,包装在shared_ptr<A>里。在 main里, 一个包含shared_ptr<A>的 std::vector被放入5个元素,最后对每个元素调用sing。如果我们用裸指针作为元素,那些对象需要被手工删除。而在这个例子里,删除是自动的,因为在vector的生存期中,每个shared_ptr的引用计数都保持为1;当 vector被销毁,所有引用计数器都将变为零,所有对象都被删除。有趣的是,即使 A的析构函数没有声明为 virtual, shared_ptr也会正确调用 B的析构函数。

输出结果:

The choir is gathered:
Do re mi fa so la
Do re mi fa so la
Do re mi fa so la
Do re mi fa so la
Do re mi fa so la
~deconstruct B
~deconstruct A
~deconstruct B
~deconstruct A
~deconstruct B
~deconstruct A
~deconstruct B
~deconstruct A
~deconstruct B
~deconstruct A

示例二:

shared_ptr<int> sp(new int(10));                //一个指向整数的shared_ptr
assert(sp.unique());                            //现在shared_ptr是指针的唯一持有者
shared_ptr<int> sp2 = sp;                       //第二个shared_ptr,拷贝构造函数
assert(sp == sp2 && sp.use_count() == 2);        //两个shared_ptr相等,指向同一个对象,引用计数为2
*sp2 = 100;                                        //使用解引用操作符修改被指对象
assert(*sp == 100);                                //另一个shared_ptr也同时被修改
sp.reset();                                     //停止shared_ptr的使用
assert(!sp);                                    //sp不再持有任何指针(空指针)

示例三:

#include "boost/shared_ptr.hpp"
#include <vector>
#include <iostream>

using namespace std;
using namespace boost;

class shared //一个拥有shared_ptr的类
{
private:
    shared_ptr<int> p;                          //shared_ptr成员变量  

public:
    shared(shared_ptr<int> p_):p(p_){}          //构造函数初始化shared_ptr
    void print()                                //输出shared_ptr的引用计数和指向的值
    {
        cout << "count:" << p.use_count() << " v =" <<*p << endl;
    }
};

void print_func(shared_ptr<int> p)                //使用shared_ptr作为函数参数
{
        //同样输出shared_ptr的引用计数和指向的值
        cout << "count:" << p.use_count() << " v=" <<*p << endl;
}

int main()
{
    shared_ptr<int> p(new int(100));
    shared s1(p), s2(p);                        //构造两个自定义类       

    s1.print();
    s2.print();

    *p = 20;                                    //修改shared_ptr所指的值
    print_func(p);
    s1.print();
}

输出结果:

count:3 v =100
count:3 v =100
count:4 v=20
count:3 v =20

C/C++之智能指针shared_ptr

时间: 2024-12-25 11:44:38

C/C++之智能指针shared_ptr的相关文章

C++智能指针 shared_ptr

C++智能指针 shared_ptr shared_ptr 是一个标准的共享所有权的智能指针, 允许多个指针指向同一个对象. 定义在 memory 文件中(非memory.h), 命名空间为 std. shared_ptr 是为了解决 auto_ptr 在对象所有权上的局限性(auto_ptr 是独占的), 在使用引用计数的机制上提供了可以共享所有权的智能指针, 当然这需要额外的开销: (1) shared_ptr 对象除了包括一个所拥有对象的指针外, 还必须包括一个引用计数代理对象的指针. (

【C++】智能指针shared_ptr 定位删除器(仿函数)

智能指针shared_ptr 用引用计数实现看起来不错,但却存在问题. 1.引用计数更新存在着线程安全: 2.循环引用--使用一个弱引用智能指针(weak_ptr)来打破循环引用(weak_ptr不增加引用计数) 3.定置删除器和空间分配器 比如打开一个文件的关闭,用malloc开辟出来的空间,用引用计数实现会出现问题. 对改变引用计数时加锁可以解决引用计数更新存在着线程安全. 循环引用问题 #include<iostream> using namespace std; #include<

智能指针 shared_ptr 解析

最近正在进行<Effective C++>的第二遍阅读,书里面多个条款涉及到了shared_ptr智能指针,介绍的太分散,学习起来麻烦,写篇blog整理一下. LinJM   @HQU shared_ptr是一个智能指针.在C++ 11颁布之前,它包含在TR1(Technical Report 1)当中,现在囊括在C++11的标准库中. 智能指针 智能指针(Smart pointers)是存储"指向动态分配(在堆上)的对象的指针"的对象.也就是说,智能指针其实是个对象.不过

c/c++ 智能指针 shared_ptr 使用

智能指针 shared_ptr 使用 上一篇智能指针是啥玩意,介绍了什么是智能指针. 这一篇简单说说如何使用智能指针. 一,智能指针分3类:今天只唠唠shared_ptr shared_ptr unique_ptr weak_ptr 二,下表是shared_ptr和unique_ptr都支持的操作 操作 功能描述 shared_ptr<T> sp 空智能指针,可以指向类型为T的对象 unique_ptr<T> up 空智能指针,可以指向类型为T的对象 p 将p用作一个条件判断,如果

智能指针——shared_ptr

boost::scoped_ptr虽然简单易用,但它不能共享所有权的特性却大大限制了其使用范围,而boost::shared_ptr可以解决这一局限.顾名思义,boost::shared_ptr是可以共享所有权的智能指针 boost::shared_ptr的管理机制其实并不复杂,就是对所管理的对象进行了引用计数,当新增一个boost::shared_ptr对该对象进行管理时,就将该对象的引用计数加一:减少一个boost::shared_ptr对该对象进行管理时,就将该对象的引用计数减一,如果该对

Boost库中的智能指针 shared_ptr智能指针

shared_ptr智能指针的意思即:boost::shared_ptr是可以智能的管理动态分配的内存资源,几个智能指针可以同时共享一个动态分配的内存的所有权. 下面我们通过一个例子来学习一下它的用法: 注 :使用shared_ptr智能指针,要加入#include <boost/shared_ptr.hpp>头文件 class example { public: ~example() { std::cout <<"It's over\n"; } void do

Boost智能指针——shared_ptr

转: http://www.cnblogs.com/TianFang/archive/2008/09/19/1294521.html boost::scoped_ptr虽然简单易用,但它不能共享所有权的特性却大大限制了其使用范围,而boost::shared_ptr可以解决这一局限.顾名思义,boost::shared_ptr是可以共享所有权的智能指针,首先让我们通过一个例子看看它的基本用法: #include <string> #include <iostream> #inclu

C++智能指针shared_ptr

shared_ptr 这里有一个你在标准库中找不到的—引用数智能指针.大部分人都应当有过使用智能指针的经历,并且已经有很多关于引用数的文章.最重要的一个细节是引用数是如何被执行的—插入,意思是说你将引用计数的功能添加给类,或者是非插入,意思是说你不这样做.Boost shared_ptr是非插入类型的,这个实现使用一个从堆中分配来的引用计数器.关于提供参数化策略使得对任何情况都极为适合的讨论很多了,但是最终讨论的结果是决定反对聚焦于可用性.可是不要指望讨论的结果能够结束. shared_ptr完

深入剖析智能指针 shared_ptr

在effective C++经常会提到智能指针,这里对shared_ptr进行一个总结: 1 简要介绍用法 智能指针主要是用于资源管理,当申请一个资源的时候为了保证在离开控制流的时候对应资源应该得到相应的释放,这个时候如果资源对应一个类,在构造类的时候进行资源的分配(也就是书中经常提到的Resource Acquisition  Is Initialization RAII),在对象离开作用域的时候调用对应的析构函数资源得到适当的释放 这里有几个智能指针得到应用: auto_ptr: 被销毁的时