auto_ptr使用总结



(1) auto_ptr的意义
auto_ptr是一种智能指针,当系统异常退出的时候避免资源泄漏(内存)。
其他的资源还对应其他的智能指针。

(2) auto_ptr的使用
std::auto_ptr<int> test(new int(1));
test将是一个auto_ptr的对象,使用一个int指针进行初始化。
test可以象其他指针一样使用,如使用* 使用->但是++不可以使用,以后也许会扩展,其实难对++做越界管理,也许可以放弃一些速度。

当使用auto_ptr的时候,必须使用显式的类型转化来初始化,如auto_ptr<classA> a(new classA),而不能使用auto_ptr<classA> a = new classA;

(3) auto_ptr所有权的转移
auto_ptr对所有权有严格的约定,一个auto_ptr只能控制一个指针,不能控制多个,当auto_ptr拥有一个指针的时候就不能在拥有其他的指针了。同时,不同的auto_ptr不能拥有同一个指针。但是存在这样的情况,不同的auto_ptr可能控制着相同的对象,不要出现这样的情况。
auto_ptr<int> a(new int); 1
auto_ptr<int> b(a); 2
auto_ptr<int> c = b; 3
auto_ptr<int> d(int); 4
d = c; 5
当2发生的时候,a将所有权放弃,b获得所有权。
当3发生时, b将放弃所有权,c获得所有权。
当5发生时, c的所有权给d,d将释放自己的所有权,并把对象删除掉。

(4) 作为参数会改变作用域
当auto_ptr以参数的形式传递给函数的时候,作用域同样发生了变化,从之前的作用域变成了函数内部的作用域。过程时这样的,当有auto_ptr作为参数传递到函数内部的时候,首先会交接自己的所有权,所有权交给了函数的参数,作用域变成了函数的内部。函数退出时,函数内部的临时变量都会离开作用域,包括传递进来接收到的auto_ptr,auto_ptr会释放自己保存的资源。在函数退出后,申请的资源就消失了,这种情况可能很出乎人的预料,因为c++一般传递参数都是传值,如何都不会改变变量本身的作用域的。

(6)在函数内部返回一个指针,可以避免内存泄漏
#include <iostream>
using namespace std;
template<class T>
auto_ptr<T> getAutoPtr()
{
 auto_ptr<T> rt(new T);
 return rt;
}
int main(void)
{
 auto_ptr<int> rt = getAutoPtr<int>();
 cout<< "["<< *rt<< "]"<< endl;
 return 0;
}

(5)作为参数时,不要传递引用
函数的参数可以是auto_ptr<classT>& 类型,当传递auto_ptr的引用的时候,有的时候会传递所有权,有的时候不会,所以永远不要这样做。

(6)const auto_ptr<classT>& 实现的是不需要传递所有权。这个特性主要应用在模板上,当使用auto_ptr实例化对象的时候不会出现问题。所以const auto_ptr<classT>&的意思是不能转移所有权,而不是不能更改数据,这里和c++信息是不一样的,还是少使用好一些。
 auto_ptr当作类的成员变量可以避免,当类在构造的时候出现异常,这样如果内存被分配了是不会被释放的,因为如果构造没有完成是不会调用析构函数的,这个时候就没有办法来释放申请的资源了。可以使用auto_ptr来避免这样的事情发生,如果不想在类种转换所有权,可以使用const来修饰。

(7) 使用auto_ptr的误区
 1 两auto_ptr不要引用同一个对象(t*),这样如果一个auto_ptr释放了资源,另一个或多个就无法获得引用对象的信息。
 2 auto_ptr不可以保存array,因为在释放的时候是使用delete,这样就会引起未知的问题。
 3 auto_ptr设计成在异常发生的时候避免内存泄漏,不要乱用。
 4 不要在容器中使用auto_ptr,因为无法满足容器的一些要求,比如在copy construct和 “=”操作时,会转移所有权。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值