关于auto_ptr的那些事

先看以下代码:

{

auto_prt<Circle> aCirCle(new Circle);

}

此时会发生内存泄露吗,并没有释放掉内存啊?其实不会的,当auto_ptr对象的生命周期结束后,会自动帮我们delete掉new的内存空间的。

auto_ptr是RAII的一个应用,其对象最美妙之处在于如果它被声明为一个函数的局部变量,或作为函数的参数,甚至是一个静态对象,我们都可以保证其指向对象的析构函数会得到调用从而释放所引用的资源。

在很多时候,我们都可以把指向动态分配的内存空间的指针交给auto_ptr对象,只要定义的auto_ptr对象不是处于堆空间,就可以保证动态分配的空间被释放掉,而不用时时去刻意记得要在new后调用相应的delete操作。

那是不是无论什么时候都把指向动态分配的内存空间的指针交给auto_ptr对象后就万事大吉了?其实不是的,还是有几个问题是需要注意的:

一、上面已经说过auto_ptr对象不能分配在堆空间上,假如是动态分配的话,如果我们忘记delete它,那还是无可奈何,除非等到程序运行结束。

二、 这里先说下auto_ptr的复制操作。对于一般的而言,复制操作不会影响到参与复制的源值。不过auto_ptr并不“普通”,假定a跟b都是auto_ptr对象,当我们用b对a进行赋值时,如果a是非空的,那么无论它指向什么东西,都将会被delete掉,代之的是b所指向的东西。因此,它们不能被用作容器元素,因为容器中的元素通常会在容器内部被拷来拷去。

三、当auto_ptr所指向的对象被删除时,它使用的是operator delete。所以,假如一个auto_ptr指向一个数组的话,那将会产生错误调用。

posted on 2009-12-18 00:28  coolzgx  阅读(198)  评论(0编辑  收藏  举报

导航