C++支持继承关系的智能指针

class RefCounted
{
protected:
    RefCounted(){ m_ref_count = 0; }
    virtual ~RefCounted(){}
public:
    void incRef() { ++m_ref_count; }
    void desRef()
    {
        if (--m_ref_count == 0) { delete this; }
    }
private:
    int m_ref_count;
};

template<typename T>
class RefPtr
{
public:
    RefPtr(){ m_ptr = 0; }

    template<typename U>
    RefPtr(U* ptr)
    {
        m_ptr = ptr;
        if (m_ptr) { m_ptr->incRef(); }
    }

    template<typename U>
    RefPtr(const RefPtr<U>& ptr)
    {
        m_ptr = ptr.getRefPtr();
        if (m_ptr) { m_ptr->incRef(); }
    }

    ~RefPtr()
    {
        if (m_ptr)
        {
            m_ptr->desRef();
            m_ptr = 0;
        }
    }

    template<typename U>
    RefPtr<T>& operator=(U* ptr)
    {
        if (m_ptr != ptr)
        {
            if (m_ptr) { m_ptr->desRef(); }
            m_ptr = ptr;
            if (m_ptr) { m_ptr->incRef(); }
        }
        return *this;
    }

    template<typename U>
    RefPtr<T>& operator=(const RefPtr<U>& ptr)
    {
        if (m_ptr != ptr.getRefPtr())
        {
            if (m_ptr) { m_ptr->desRef(); }
            m_ptr = ptr.getRefPtr();
            if (m_ptr) { m_ptr->incRef(); }
        }
        return *this;
    }

    T* operator->() const { return m_ptr; }
    T& operator*() const { return *m_ptr; }
    operator bool() const { return (m_ptr != 0); }
    T* getRefPtr() const { return m_ptr; }

private:
    T* m_ptr;
};

template<typename T, typename U>
bool operator==(const RefPtr<T>& a, const RefPtr<U>& b) { return (a.getRefPtr() == b.getRefPtr()); }
template<typename T, typename U>
bool operator==(const RefPtr<T>& a, const U* b) { return (a.getRefPtr() == b); }
template<typename T, typename U>
bool operator==(const U* a, const RefPtr<T>& b) { return (a == b.getRefPtr()); }

template<typename T, typename U>
bool operator!=(const RefPtr<T>& a, const RefPtr<U>& b) { return (a.getRefPtr() != b.getRefPtr()); }
template<typename T, typename U>
bool operator!=(const RefPtr<T>& a, const U* b) { return (a.getRefPtr() != b); }
template<typename T, typename U>
bool operator!=(const U* a, const RefPtr<T>& b) { return (a != b.getRefPtr()); }
时间: 2024-11-05 13:49:26

C++支持继承关系的智能指针的相关文章

More Effective C++ 条款28 Smart Pointers(智能指针)

1. 智能指针(如标准库的auto_ptr,shared_ptr,weak_ptr,boost的scoped_ptr等)主要用于动态内存的管理,同时提供给用户与内置指针一样的使用方法,本条款主要涉及智能指针在构造与析构,复制和赋值,解引等方面的注意点,而非智能指针的实现细节. 2. 智能指针的构造,赋值,析构 智能指针的copy constructor,assignment operator,destructor对应于不同的观念而有不同的实现,主要有三种选择: 1).不允许对象的共享,在调用co

NS3-对象框架之智能指针

title: 03.NS-3的对象框架 之 智能指针 tags: 新建,模板,小书匠 slug: storywriter/upgrade_log grammar_mindmap: true renderNumberedHeading: true grammar_code: true grammar_decorate: true grammar_mathjax: true 一.NS-3的对象框架之智能指针 NS-3提供了一套基于引用计数的智能指针系统,可以使得对象在不再被使用时自动被删除.使用一个

四种智能指针:auto_ptr,unique_ptr,shared_ptr,weak_ptr

stl中auto_ptr,unique_ptr,shared_ptr,weak_ptr四种智能指针的使用总结 (1)auto_ptr 主要用于解决资源自动释放的问题.防止用户忘记delete掉new申请的内存空间.使用auto_ptr会在离开变量的作用域之后直接调用析构函数进行资源释放. void Function() { auto_ptr<Obj> ptr(new Obj(20)); ... if (error occur) throw exception... } 但是,这是一种被c++1

【C/C++学院】0816-引用包装器/仿函数/转义字符 R”()”/using别名/模板元编程 比递归优化/智能指针/多线程/静态断言以及调试技能的要求 assert

引用包装器  std::ref(变量) #include<iostream> template<class T> void com(T arg)//模板函数,引用无效,引用包装器 { std::cout <<"com ="<< &arg << "\n"; arg++; } void main() { int count = 10; int & rcount = count; com(coun

浅谈智能指针的历史包袱

我们学习C++的时候,想必都会听说一个叫智能指针的东西,在初听这个词的时候,我们都难免不被“智能”两个字所吸引,感觉它会比较高级,让人有种忍不住想用一把的冲动. 但事实上,它可能并没有我们所想的那样“智能”.好用,它本质上其实就是一个对象,它去接管了原指针所管理的资源.但这里单单用一个对象就想有“智能”的效果并没有那么容易.在智能指针发展的过程中,出现了Autor_ptr等多种版本的智能指针,但它们都确都或多或少有一些问题存在(相信早期的前辈们会深有感触).但智能指针的使用性却是不可否认的.它在

c/c++ 继承与多态 文本查询的小例子(非智能指针版本)

问题:在上一篇继承与多态 文本查询的小例子(智能指针版本)在Query类里使用的是智能指针,只把智能指针换成普通的指针,并不添加拷贝构造方法,会发生什么呢? 执行时,代码崩掉. 分析下面一行代码: Query qb = ~Query("Alice"); 1,首先调用Query(string)的构造函数,把Query的成员q指向了new WordQuery(s) Query::Query(const std::string& s) : q(new WordQuery(s)){ s

Chromium和WebKit的智能指针实现原理分析

C++不像Java一样,由虚拟机负责对象分配和释放.也就是说,开发人员使用C++编写代码时,要自己负责对象分配和释放.WebKit和Chromium都是使用C++开发的,因此它们也面临上述问题.在解决对象释放问题时,要做到在对象不需要时自动释放,因为手动释放会带来忘记释放或者释放后又继续使用的隐患.智能指针是实现对象自动释放的有效技术手段.本文就分析Chromium和WebKit的智能指针的实现. 老罗的新浪微博:http://weibo.com/shengyangluo,欢迎关注! 在现实中,

boost智能指针之shared_ptr和weak_ptr

std::auto_ptr很多的时候并不能满足我们的要求,比如auto_ptr不能用作STL容器的元素.boost的smart_ptr中提供了4种智能指针和2种智能指针数组来作为std::auto_ptr的补充. shared_ptr<boost/shared_ptr.hpp>:使用shared_ptr进行对象的生存期自动管理,使得分享资源所有权变得有效且安全. weak_ptr<boost/weak_ptr.hpp>:weak_ptr 是 shared_ptr 的观察员.它不会干

Android系统的智能指针(轻量级指针、强指针和弱指针)的实现原理分析

文章转载至CSDN社区罗升阳的安卓之旅,原文地址:http://blog.csdn.net/luoshengyang/article/details/6786239 Android 系统的运行时库层代码是用C++来编写的,用C++来写代码最容易出错的地方就是指针了,一旦使用不当,轻则造成内存泄漏,重则造成系统崩溃.不过系统为 我们提供了智能指针,避免出现上述问题,本文将系统地分析Android系统智能指针(轻量级指针.强指针和弱指针)的实现原理. 在使用C++来编写代码的过程中,指针使用不当造成