智能指针auto_ptr、内存泄漏解决

在C++11中,已经不使用auto_ptr,而用 unique_ptr进行替代,不过二者原理都差不多。头文件:memory

智能指针:实质上是一个类,在创建智能指针的时候,本质上是在栈上创建了一个对象,而析构函数总是会在出栈时被调用,清理会自动进行。unique_ptr(auto_ptr)通过在栈上构建一个对象a,对象a中动态分配内存指针p,所有对指针p的操作都转为对对象a的操作。而在a的析构函数中会自动释放p的空间,而该析构函数是编译器自动调用的,无需程序员操心。
unique_ptr(auto_ptr):都是唯一指针,且只能智能指针都要直接初始化,但unique_ptr(auto_ptr)不能像shared_ptr那样共享,对于指针不能复制,只能转移其控制权,利用release()和reset()函数,转移之后,原来的指针就失效了。

内存泄漏定义
1、new了一个空间,但没有delete;
2、动态内存不存在作用域的问题,但保存其地址的指针变量是受作用域影响的,指针一般是局部变量,在函数内部new以后没有释放,
那么该区域的内存将始终不能为其他数据所使用,而指向该内存的指针是个局部变量,当定义该指针的函数结束并且返回时,指针也就消失了,我们就再也找不到该块中的内存区域,指向该内存区域的指针自动消失了。 计算机就再也找不到该区域的内存了,就好像是丢失了这块内存一样,这种情况被称之为内存泄漏。

优点:
解决内存泄漏问题,智能指针在出栈时,都会自动释放指针,而不用像使用普通指针那样要考虑因为异常等原因没有delete掉。

使用注意:
1、应绝对避免把auto_ptr放到容器中,(unique_ptr)auto_ptr拷贝赋值时是所有权转移,而在容器中可能会产生临时对象拷贝赋值,临时对象获得所有权之后就析构了释放了对象。并且很难避免STL内部对容器中的元素实现赋值,这样便会使容器中多个元素被置位NULL。

vector<auto_ptr<MyClass>>m_example//绝不能这样做

2、auto_ptr的析构函数调用的是delete不是delete [],所以不能使用智能指针数组。

3、避免unique_ptr(auto_ptr)之间的赋值。

4、当将unique_ptr(auto_ptr)作为函数参数时,最好声明为const auto_ptr&引用,避免所有权转移,当函数返回值可以简单的传值。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值