C++ RCSP智能指针简单实现与应用

智能指针的实现代码来源博客:《http://blog.csdn.net/to_be_better/article/details/53570910》

修改:添加 get()函数,用以获得原始指针(raw pointer)。

其余思路来源《Effective C++》

智能指针的实现代码如下:

template <typename T>
class SmartPtr;
template <typename T>
class Ptr
{
    friend class SmartPtr<T>;

    T *m_ptr;
    size_t m_count;

    Ptr(T *p = NULL) : m_ptr(p), m_count(1) {}
    ~Ptr()
    {
        delete m_ptr;
    }
};
template <typename T>
class SmartPtr
{
  public:
    SmartPtr(T *p = NULL) : m_p(new Ptr<T>(p)) {}
    SmartPtr(const SmartPtr &sp) : m_p(sp.m_p)
    {
        ++m_p->m_count;
    }

    SmartPtr &operator=(const SmartPtr &sp)
    {
        ++sp.m_p->m_count;
        if (--m_p->m_count == 0)
        {
            delete m_p;
        }
        m_p = sp.m_p;

        return *this;
    }

    T *operator->() { return m_p->m_ptr; }
    const T *operator->() const { return m_p->m_ptr; }

    T operator*() { return *m_p->m_ptr; }
    T *get()  /*get raw pointer*/
    {
        return m_p->m_ptr;
    }
    ~SmartPtr()
    {
        if (--m_p->m_count == 0)
            delete m_p;
    }

  private:
    Ptr<T> *m_p;
};

引用计数型智能指针(reference-counting smart pointer, RCSP)可实现持续追踪共有多少对象指向某笔资源,并在无人指向它时自动删除该资源。

在c++中资源管理中为防止意外退出而导致资源泄漏。

这种reference counting 可以允许copying行为,如需抑制copying,以private 方式继承Uncopyable类即可。

Uncopyable类:

class Uncopyable
{
  protected:
    Uncopyable() {}
    ~Uncopyable() {}

  private:
    Uncopyable(const Uncopyable &);
    Uncopyable &operator=(const Uncopyable &);
};

一个应用例子:

目的是创建一个类的智能指针,用以描述文件的一些属性的类,在后续代码中使用这个指针来赋予或读取这些属性。当然,使用智能指针为了防止资源泄漏,符合本文初衷。

由成员函数:createFileAttrs() 产生动态创建一个静态的智能指针,由这个指针去给类中的成员变量分配资源,并返回这个指针,即可实现功能。

测试类:

class FileAttr
{
public:
    ~FileAttr();
    static SmartPtr<FileAttr> createFileAttrs();
    char *md5;
private:
    FileAttr();
};
FileAttr::FileAttr()
{}
FileAttr::~FileAttr()
{
    cout << "destructor" << endl;
    delete[] md5;
}
SmartPtr<FileAttr> FileAttr::createFileAttrs()
{
    static SmartPtr<FileAttr> fileAttr(new FileAttr());
    fileAttr->md5 = new char[20];
    return fileAttr;
}

应用方法:

int main()
{
    SmartPtr<FileAttr> fa = FileAttr::createFileAttrs(); // 使用智能指针
    /* FileAttr *fa = FileAttr::createFileAttrs().get(); // 或者使用原始指针 */
    {
        memcpy(fa->md5, "md51", 4);
    }
    {
        memcpy(fa->md5 + 4, "md52", 4);
    }
    cout << fa->md5<<endl;
    return 0;
}

打印输出:

md51md52
destructor

由于自定义类未重载operator=,所以直接使用智能指针比较合适,需要原始指针的话调用get()函数即可。

原文地址:https://www.cnblogs.com/bobojiang/p/8580015.html

时间: 2024-10-11 16:16:39

C++ RCSP智能指针简单实现与应用的相关文章

C++智能指针简单剖析

导读 最近在补看<C++ Primer Plus>第六版,这的确是本好书,其中关于智能指针的章节解析的非常清晰,一解我以前的多处困惑.C++面试过程中,很多面试官都喜欢问智能指针相关的问题,比如你知道哪些智能指针?shared_ptr的设计原理是什么?如果让你自己设计一个智能指针,你如何完成?等等--.而且在看开源的C++项目时,也能随处看到智能指针的影子.这说明智能指针不仅是面试官爱问的题材,更是非常有实用价值. 下面是我在看智能指针时所做的笔记,希望能够解决你对智能指针的一些困扰. 目录

【转】C++智能指针简单剖析

原文链接:http://www.cnblogs.com/lanxuezaipiao/p/4132096.html 导读 最近在补看 <C++ Primer Plus>第六版,这的确是本好书,其中关于智能指针的章节解析的非常清晰,一解我以前的多处困惑.C++面试过程中,很多面试官都喜欢问智能指针相关的 问题,比如你知道哪些智能指针?shared_ptr的设计原理是什么?如果让你自己设计一个智能指针,你如何完成?等等…….而且在看开源的C++项目 时,也能随处看到智能指针的影子.这说明智能指针不仅

C++智能指针简单解析

导读 最近在补看<C++ Primer Plus>第六版,这的确是本好书,其中关于智能指针的章节解析的非常清晰,一解我以前的多处困惑.C++面试过程中,很多面试官都喜欢问智能指针相关的问题,比如你知道哪些智能指针?shared_ptr的设计原理是什么?如果让你自己设计一个智能指针,你如何完成?等等--.而且在看开源的C++项目时,也能随处看到智能指针的影子.这说明智能指针不仅是面试官爱问的题材,更是非常有实用价值. 下面是我在看智能指针时所做的笔记,希望能够解决你对智能指针的一些困扰. 目录

C/C++ 智能指针简单剖析

导读 最近在补看<C++ Primer Plus>第六版,这的确是本好书,其中关于智能指针的章节解析的非常清晰,一解我以前的多处困惑.C++面试过程中,很多面试官都喜欢问智能指针相关的问题,比如你知道哪些智能指针?shared_ptr的设计原理是什么?如果让你自己设计一个智能指针,你如何完成?等等…….而且在看开源的C++项目时,也能随处看到智能指针的影子.这说明智能指针不仅是面试官爱问的题材,更是非常有实用价值. 下面是我在看智能指针时所做的笔记,希望能够解决你对智能指针的一些困扰. 目录

【C++】智能指针简单剖析

转自 http://www.cnblogs.com/lanxuezaipiao/p/4132096.html 导读 最近在补看<C++ Primer Plus>第六版,这的确是本好书,其中关于智能指针的章节解析的非常清晰,一解我以前的多处困惑.C++面试过程中,很多面试官都喜欢问智能指针相关的问题,比如你知道哪些智能指针?shared_ptr的设计原理是什么?如果让你自己设计一个智能指针,你如何完成?等等--.而且在看开源的C++项目时,也能随处看到智能指针的影子.这说明智能指针不仅是面试官爱

智能指针简单实现

很多人都误以为智能指针是一个指针,其实不然,智能指针不是指针,智能指针是一个模板,由智能指针实例化出来的的对象具有和常规指针相似的行为,但是他能够自动的释放所指向的对象,所以我们称之为智能指针.如果我们用普通指针来创建一个指向某个对象的指针,那么我们最后必须要手动释放这块空间,而智能指针它是一个类,它释放空间是通过析构函数完成的,正是由于有了这一层封装机制,所以智能指针才能够管理一个对象的生命周期.(定义一个类来封装资源的分配和释放,在构造函数完成资源的分配和初始化,在析构函数完成资源的清理,可

智能指针的简单总结

1. 智能指针背后的设计思想 我们先来看一个简单的例子: void remodel(std::string & str) { std::string * ps = new std::string(str); ... if (weird_thing()) throw exception(); str = *ps; delete ps; return; } 当出现异常时(weird_thing()返回true),delete将不被执行,因此将导致内存泄露. 如何避免这种问题?有人会说,这还不简单,直

C++智能指针及其简单实现

本将主要介绍智能指针shared_ptr和unique_ptr,并简单实现基于引用计数的智能指针. 自C++11起,C++标准提供两大类型的智能指针: 1. Class shared_ptr实现共享式拥有(shared ownership)概念.多个智能指针可以指向相同对象,该对象和其相关资源会在“最后一个引用(reference)被销毁”时候释放.为了在结构复杂的情境中执行上述工作,标准库提供了weak_ptr.bad_weak_ptr和enable_shared_from_this等辅助类.

话说智能指针发展之路

从RAII说起 教科书里关于"动态创建内存"经常会提醒你,new一定要搭配delete来使用,并且delete掉一个指针之后,最好马上将其赋值为NULL(避免使用悬垂指针). 这么麻烦,于是乎,这个世界变成11派人: 一派人勤勤恳恳按照教科书的说法做,时刻小心翼翼,苦逼连连: 一派人忘记教科书的教导,随便乱来,搞得代码处处bug,后期维护骂声连连: 最后一派人想了更轻松的办法来管理动态申请的内存,然后悠闲唱着小曲喝着茶- (注:应该没人看不懂11是怎么来的--就是十进制的3的二进制形式