c++之智能指针

什么是智能指针呢?
智能指针(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;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值