c++之智能指针

来源:互联网 发布:js typeof5类型 编辑:程序博客网 时间:2024/05/18 01:56

什么是智能指针呢?
智能指针(smart pointer)是存储指向动态分配(堆)对象指针的类,用于生存期控制,能够确保自动正确的销毁动态分配的对象,防止内存泄露。它的一种通用实现技术是使用引用计数(reference count)。
智能指针是RAII的一种应用!
RAII,也称为“资源获取就是初始化”,是c++等编程语言常用的管理资源、避免内存泄露的方法。它保证在任何情况下,使用对象时先构造对象,最后析构对象。
智能指针的作用:
1:智能管理指针的释放
2:能够像指针一样使用
3:能完成正常的赋值拷贝
智能指针就是模拟指针动作的类。所有的智能指针都会重载 -> 和 * 操作符。智能指针还有许多其他功能,比较有用的是自动销毁。这主要是利用栈对象的有限作用域以及临时对象(有限作用域实现)析构函数释放内存。当然,智能指针还不止这些,还包括复制时可以修改源对象等。智能指针根据需求不同,设计也不同(写时复制,赋值即释放对象拥有权限、引用计数等,控制权转移等)。
常见的智能指针:
(1)auto_ptr 管理权转移,带有缺陷的设计,会释放一个空间多次,尽量不要使用它。(c++98/c++03)
(2)scoped_ptr 防拷贝,高效,简洁。不需要拷贝/赋值的时候使用。(boost库)
(3)share_ptr 共享(引用计数)管理,支持赋值/拷贝。缺陷是循环引用(weak_ptr).(boost库)
(4)weak_ptr 赋值share_ptr 解决循环引用,不增加引用计数。(boost库)

#pragma once//模拟实现智能指针  基于引用计数的智能指针template <class T>class SmartPointer{public:    //构造    SmartPointer(T* p = 0)        :_ptr(p)        , _count(new size_t)    {        if (p)            *_count = 1;        else            *_count = 0;    }    //拷贝构造    SmartPointer(const SmartPointer&  s)    {        if (this != &s)        {            _ptr = s._ptr;            _count = s._count;            (*_count)++;        }    }    //重载赋值    SmartPointer<T>& operator=(const SmartPointer<T>& s)    {        if (_ptr == s._ptr)        {            return *this;        }        ReleaseCout();        _ptr = s._ptr;        _count = s._count;        (*_count)++;        return *this;    }    //重载操作符*    T& operator*()    {        if(ptr)        return *_ptr;    }    //重载操作符->    T* operator->()    {        if (ptr)            return _ptr;    }    //析构函数    ~SmartPointer()    {        if (--(*_count) == 0)        {            delete _ptr;            delete _count;            _ptr = NULL;            _count = NULL;        }    }private:    T* _ptr;    size_t*  _count;    void ReleaseCout()    {        if (_ptr)        {            (*_count--);            if ((*_count) == 0)            {                delete _ptr;                delete _count;                _ptr = NULL;                _count = NULL;            }        }    }};void test(){    SmartPointer<char> p1(new char('a'));    SmartPointer<char> p2(p1);    SmartPointer<char> p3;    p3 = p2;    p3 = p1;    p3 = p3;}
原创粉丝点击