`

shared_ptr

阅读更多
shared_ptr早期叫做counted_ptr,它实现了引用计数型的智能指针,与scoped_ptr一样包装了new操作符在堆上分配的动态对象,但可以被自由地拷贝和赋值。同时它弥补了auto_ptr因为转移语义而不能把指针作为STL容器元素的缺陷。

share_ptr是强引用,像铁丝绑住堆上的对象,只要有一个指向x对象的shared_ptr存在,该x对象就不会析构,它是原子操作,没有用锁

template<class T> class shared_ptr
{
public:
    typedef T element_type;
    //创建一个持有空指针的shared_ptr
    shared_ptr();
    //获得指向类型T的指针p的管理权,同时引用计数=1.这个构造函数要求Y类型必须能够转换成T类型
    template<class Y> explicit shared_ptr(Y *p);
    //和上面差不多,参数d指定了析构时的定制删除器
    template<class Y,class D> shared_ptr(Y* p,D d);
    ~shared_ptr();

    //从另一个shared_ptr获得指针的管理权,同时引用计数+1,然后两个shared_ptr共享一个指针的管理权
    shared_ptr(shared_ptr const & r);
    //从一个auto_ptr获得指针的管理权,引用计数=1,同时auto_ptr自动失去管理权
    template<class Y> explicit shared_ptr(std::auto_ptr<Y>& r);

    //从一个shared_ptr或auto_ptr获得管理权
    shared_ptr & operator=(shared_ptr const & r);
    template<class Y> shared_ptr & operator=(shared_ptr<Y> const & r);
    template<class Y> shared_ptr & operator=(std::auto_ptr<Y> & r);

    //和scoped_ptr不完全一样,引用计数器-1,停止对指针的共享,改为管理另一个指针,如果引用计数<0,发生删除操作
    void reset();
    template<class Y> void reset(Y *p);
    template<class Y,class D> void reset(Y *p,D d);

    T & operator*()const;
    T * operator->()const;
    T * get() const;

    //在shared_ptr是指针的唯一所有者时返回true,比use_count()=1速度快,安全
    bool unique()const;
    //一般用于测试
    long use_count() const;

    operator unspecified-bool-type()const;
    void swap(shared_ptr & b);
};



不能使用常规的如static_cast之类的转型,要用就用static_pointer_cast<T>(),const_pointer_cast<T>(),dynamic_pointer_cast<T>()
#include<boost/shared_ptr.hpp>
#include<iostream>
using namespace boost;
using namespace std;

int main()
{
    shared_ptr<int> p(new int);
    *p = 10;
    cout << *p << endl;
    shared_ptr<int> p2 = static_pointer_cast<int>(p);
    cout << *p2 << endl;
}

10
10


#include<boost/shared_ptr.hpp>
#include<boost/scoped_ptr.hpp>
#include<string>
#include<iostream>
using namespace boost;
using namespace std;

void print(shared_ptr<string> p)
{
    cout << "count:" << p.use_count() << ",v=" << *p << endl;
}

int main()
{
    shared_ptr<string> p(new string("abc"));
    cout << p.use_count() << endl;
    shared_ptr<string> p1(p);
    shared_ptr<string> p2(p);
    cout << p1.use_count() << "," << *p1 << endl;
    cout << p.use_count() << "," << *p << endl;
    cout << p2.use_count() << "," << *p2 << endl;
    print(p2);//内部函数拷贝了一个shared_ptr对象,引用计数+1
    cout << p2.use_count() << "," << *p2 << endl;//自动析构,引用计数恢复
    print(p1);
    print(p);
}

1
3,abc
3,abc
3,abc
count:4,v=abc
3,abc
count:4,v=abc
count:4,v=abc


#include<boost/shared_ptr.hpp>
#include<iostream>
#include<vector>
using namespace boost;
using namespace std;

//桥接模式
class sample
{
private:
    class impl;
    shared_ptr<impl> p;
public:
    sample();
    void print();
};

class sample::impl
{
public:
    void print(){cout<<"impl"<<endl;}
};

sample::sample():p(new impl){}

void sample::print(){
    p->print();
}

int main()
{
    typedef vector< shared_ptr<int> > v;
    v v1(5);
    int i=0;
    for(v::iterator iter=v1.begin();iter!=v1.end();++iter){
        *iter = shared_ptr<int>(new int(++i));
        cout << *(*iter) << endl;
    }
    sample s;
    s.print();
}

1
2
3
4
5
impl


#include<boost/shared_ptr.hpp>
#include<iostream>
using namespace std;
using namespace boost;

//工厂模式
class abstract
{
public:
    virtual void f()=0;
    virtual void g()=0;
protected:
    virtual ~abstract(){}
};

class impl:public abstract
{
public:
    virtual void f()
    {
        cout << "class impl f" << endl;
    }
    virtual void g()
    {
        cout << "class impl g" << endl;
    }
};

shared_ptr< abstract> create()
{
    return shared_ptr<abstract>(new impl);
}

int main()
{
    shared_ptr<abstract> a = create();
    a->f();
    a->g();
}

class impl f
class impl g


shared_ptr能够存储void*型的指针,还可以定制删除器:
shared_ptr<void> p ((void*)0,delFun());
分享到:
评论

相关推荐

    智能指针shared_ptr的Demo

    3. 从原始指针转换:`std::shared_ptr&lt;T&gt; ptrRaw(ptr_raw);`,其中`ptr_raw`是原始指针。 4. 从另一个`shared_ptr`复制:`std::shared_ptr&lt;T&gt; ptrCopy(ptrOther);`,这样两个`shared_ptr`将共享相同的引用计数。 ...

    C++ unique_ptr weak_ptr shared_ptr auto_ptr智能指针.doc

    在 C++ 中,有四种智能指针:auto_ptr、unique_ptr、shared_ptr 和 weak_ptr,每种智能指针都有其特点和使用场景。 一、auto_ptr auto_ptr 是 C++98 中引入的智能指针,它可以自动释放动态分配的内存。但是,auto_...

    shared_ptr for arm

    shared_ptr arm, use arm asm code

    C++ 智能指针(shared_ptr/weak_ptr)源码

    C++ 智能指针(shared_ptr/weak_ptr)源码 源码位置:gcc-6.1.0\gcc-6.1.0\libstdc++-v3\include\tr1 这里只单列shared_ptr.h文件用于分析

    shared_ptr只能对new的内存操作

    ### shared_ptr只能对new的内存操作 在C++标准库中,`std::shared_ptr`(在早期版本中可能使用`boost::shared_ptr`)是一种智能指针,它通过引用计数来管理动态分配的对象生命周期。`std::shared_ptr`的设计目的是...

    用shared_ptr实现多线程对全局变量的读写,copy-on-write技术

    参考陈硕的多线程服务端编程&gt;&gt;,中的用shared_ptr实现copy-on-write技术,不过这里的线程采用的是c++11的线程库

    C++11 下使用 Boost.Serialization 库实现智能指针的序列化

    在实际操作中,为了使序列化过程更加简洁,通常会创建辅助类(如`shared_ptr_helper.cpp`和`shared_ptr_helper.hpp`中的类)来封装特定类型的智能指针的序列化和反序列化过程。例如,你可以创建一个`serialize`模板...

    C++11 std::shared_ptr总结与使用示例代码详解

    C++11 std::shared_ptr总结与使用示例代码详解 std::shared_ptr是C++11中引入的一种智能指针,主要用于自动管理资源的生命周期。下面是std::shared_ptr的总结和使用示例代码详解: 一、智能指针的用途 std::...

    C++11新特性之智能指针(shared_ptr/unique_ptr/weak_ptr)

    本文主要讨论了三种智能指针:`shared_ptr`、`unique_ptr`和`weak_ptr`。 首先,`shared_ptr`是引用计数型智能指针,它维护了一个内部的引用计数,用于跟踪有多少个`shared_ptr`实例指向同一对象。当创建一个新的`...

    C++智能指针shared_ptr分析

    C++智能指针shared_ptr分析 概要: shared_ptr是c++智能指针中适用场景多,功能实现较多的智能指针。它采取引用计数的方法来实现释放指针所指向的资源。下面是我代码实现的基本功能。 实例代码: template class ...

    详解C++中shared_ptr的使用教程

    在C++编程中,shared_ptr是智能指针的一种,它能够自动记录共享对象的引用次数,并且在引用计数降至零时自动删除对象,从而防止内存泄漏。shared_ptr是C++11标准中引入的,它解决了资源管理的问题,尤其是动态内存...

    C++11 智能指针之shared_ptr代码详解

    C++11智能指针之shared_ptr是一个非常重要且实用的特性,它为C++的动态内存管理提供了安全性和便利性。在C++中,动态分配的内存资源在使用完毕后必须被显式地释放,否则会造成内存泄漏。为了避免这种情况,传统的...

    shared_ptr线程安全性全面分析

    《shared_ptr线程安全性全面分析》 在C++的智能指针家族中,`shared_ptr`是一个重要成员,它提供了一种自动管理内存的方式,尤其是当多个指针共享同一对象时。`shared_ptr`的设计考虑到了多线程环境中的线程安全性...

Global site tag (gtag.js) - Google Analytics