C++智能指针

转载自:https://blog.csdn.net/zhourong0511/article/details/80315961

一、智能指针
1.什么是智能指针?
是一个类,用来存储指针(指向动态分配对象的指针)。

2.智能指针满足的条件:

  1. 具有RAII思想(Resource Acquisition Is Initialization)
  2. 能够像指针一样(运算符重载,解引用,指向对象成员)
  3. 对资源进行封装和管理


RAII思想(资源分配及初始化)

  • 定义一个类来封装资源的分配与释放,
  • 构造函数中完成资源的分配及初始化;
  • 析构函数中完成资源的清理,可以保证资源的正确初始化和释放
  • 如果对象是用声明的方式在栈上创建局部对象,那么RAII机制就会正常工作,当离开作用域对象会自动销毁而调用析构函数释放资源。


3.引入智能指针的目的:自动释放内存,抛异常后没有对内存做delete操作,会导致内存泄露其实在throw前加一个delete语句就可以解决问题,但是代码超级超级多的时候,如果有多个异常抛出,难道我们要写多个delete语句如此麻烦吗?

个人理解:

1.智能指针是通过基本类型(模板类)指针,构造类的对象,只能指针本身就是一个自定义的对象。

2.当此对象被销毁时,即调用此对象的析构函数,释放此指针。也就是用栈中的空间来管理堆中的内存。


二、六种常用的智能指针

auto_ptr
auto_ptr事实上是一个类,在构造对象时获取对象的管理权,
无需考虑释放动态内存开辟的空间,在析构函数中直接释放,不会出现内存泄漏的问题。

//模拟实现auto_ptr
template<class T>
class Auto_ptr
{
public:
    Auto_ptr(T*ptr)//构造函数
        :_ptr(ptr)
    {}
    Auto_ptr(Auto_ptr<T>&ap)//拷贝构造
        :_ptr(ap._ptr)
    {
        ap._ptr = NULL;
    }
    Auto_ptr<T>&operator=(Auto_ptr<T>&ap)//赋值运算符的重载
    {
        if (this != &ap)
        {
            if (_ptr)
            {
                delete _ptr;
            }
            _ptr = ap._ptr;
            ap._ptr = NULL;
        }
        return *this;
    }
    ~Auto_ptr()//析构函数
    {
        if (_ptr)
        {
            delete _ptr;
        }
    }

    T&operator*()
    {
        return *_ptr;
    }
    T*operator->()
    {
        return _ptr;
    }

private:
    T*_ptr;
};

struct AA
{
    int _a;
    int _b;
};

int main()
{
    Auto_ptr<int> ap(new int(3));
    Auto_ptr<int> ap1(ap);
    Auto_ptr<int> ap2(ap);//一个Auto_ptr被拷贝或赋值后,其已经失去了对原对象的所有权,指为NULL

    Auto_ptr<AA>ap3(new AA);
    ap3->_a = 2;
    ap3->_b = 3;

    cout << &ap << endl;
    cout << &ap1 << endl;
    cout << &ap2 << endl;

    system("pause");
    return 0;
}

缺陷:

一个指针变量指向的空间不能由两个auto_ptr管理,不然会析构两次,使程序崩溃。(不推荐使用)

auto_ptr的拷贝构造,将源指针的管理权交给目标指针,会使得源指针悬空,解引用是会出现很多问题。

auto_ptr不能用来管理数组,析构函数中用的是delete。

2. scoped_ptr

防拷贝,粗暴的方式(推荐使用)
1.拷贝构造函数和赋值运算符重载函数只声明不实现
2.用private对其进行访问限定,防止在类外定义

 

 

转载于:https://www.cnblogs.com/lonelamb/p/11267151.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值