智能指针auto_ptr是C++标准库提供的一个类模板,auto_ptr对象通过初始化指向由new创建的动态内存,它是这块内存的拥有者,当auto_ptr对象生命周期结束时,其析构函数会将auto_ptr对象拥有的动态内存自动释放。即使发生异常,通过异常的栈展开过程也能将动态内存释放。说明见下文。
1.头文件。
#include
2.初始化auto_ptr对象。
1) 构造函数
1] 将已存在的new出的动态内存的普通指针作为参数来构造
int* p = new int(33);
auto_ptr
2] 直接构造智能指针
auto_ptr< int > api( new int( 33 ) );
2) 拷贝构造
利用已经存在的智能指针来构造新的智能指针
auto_ptr< string > pstr_auto( new string( "Brontosaurus" ) );
auto_ptr< string > pstr_auto2( pstr_auto ); //利用pstr_auto来构造pstr_auto2
智能指针auto_ptr是独享的,在拷贝构造或赋值时都会发生拥有权转移,保证一个内存只有一个智能指针指向它。在此例中,pstr_auto将失去对字符串"Brontosaurus"内存的所有权,而pstr_auto2将其获得。pstr_auto2对象销毁时,pstr_auto2负责自动销毁new出来的内存。
3) 赋值
利用已经存在的智能指针来构造新的智能指针
auto_ptr< int > p1( new int( 1024 ) );
auto_ptr< int > p2( new int( 2048 ) );
p1 = p2;
赋值后,p1 不再指向原来的内存1024,1024被删除,p2失去指向内存2048,同时p1指向内存2048。
3.禁止用多个auto_ptr对象指向同一块内存
int* p = new int(0);
auto_ptr
auto_ptr
auto_ptr是独占的,ap1与ap2都认为指针p是归它管的,在析构时都试图删除p, 两次删除同一个对象的行为在C++标准中是未定义的。所以我们必须禁止这样使用auto_ptr。
4.auto_ptr不可指向数组
因为auto_ptr对象析构时调用的delete,而数组的回收应该使用delete[],所以用auto_ptr
指向数组会有问题。
5.auto_ptr不可使用在容器中
因为auto_ptr是独占的,在拷贝或赋值时都会发生所有权转移。
6.警惕智能指针作为参数
1) 按值传递时,函数调用过程中在函数的作用域中会产生一个局部对象来接收传入的auto_ptr(拷贝构造),这样,传入的实参auto_ptr就失去了其对原对象的所有权,而该对象会在函数退出时被局部auto_ptr删除。如下例:
void f(auto_ptr
{
cout<<*ap;
}
auto_ptr
f(ap1);
cout<<*ap1; //错误,经过f(ap1)函数调用,ap1已经不再拥有任何对象了。
2) 引用或指针时,不会存在上面的拷贝过程。但我们并不知道在函数中对传入的auto_ptr做了什么,如果当中某些 *** 作使其失去了对对象的所有权,那么这还是可能会导致致命的执行期错误。
结论:const reference是智能指针作为参数传递的底线。
7. auto_ptr不能初始化为指向非动态内存
原因很简单,delete 表达式会被应用在不是动态分配的指针上这将导致未定义的程序行为。
8.禁止在其它地方delete智能指针指向的内存
否则会delete两次导致程序崩溃。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)