分类: C/C++
2008-08-07 17:41:57
#includeauto_ptr后面的尖括弧里指定auto_ptr指针的类型,在这个例子中是string。然后auto_ptr句柄的名字,在这个例子中是pstr。最后是用动态分配的对象指针初始化这个实例。注意你只能使用auto_ptr构造器的拷贝,也就是说,下面的代码是非法的:#include using namespace std; void func() { auto_ptr pstr (new string); /* 创建并初始化auto_ptr */ }
auto_ptrAuto_ptr是一个模板,因此它是完全通用的。它可以指向任何类型的对象,包括基本的数据类型:pstr = new string; //编译出错
auto_ptr一旦你实例化一个auto_ptr,并用动态分配的对象地址对它进行了初始化,就可以将它当作普通的对象指针使用,例如:pi (new int);
*pstr = "hello world"; //赋值 pstr->size(); //调用成员函数之所以能这样做是因为auto_ptr重载了操作符&,*和->。不要被语法误导,记住pstr是一个对象,不是一个指针。
void func() { auto_ptrC 保证在堆栈展开过程中,自动存储类型的对象被自动摧毁。因此,如果g()掷出异常,pstr的析构函数将会在控制被转移到catch(...)块之前执行。因为pstr的析构函数删除其绑定的串指针,所以不会有内存溢出发生。这样我们在使用动态分配对象时,利用auto_ptr就实现了自动和安全的本地对象。pstr (new string); g(); //如果g()掷出异常,pstr 被自动摧毁 }
auto_ptr记住不管什么时候使用数组的new操作时,必须要用delete[]来摧毁数组。因为auto_ptr的析构函数只对非数组类型起作用。所以数组是不能被正确摧毁的话,程序的行为是不明确的。总之,auto_ptr控制一个由new分配的单对象指针,仅此而已。 下载本文示例代码pstr (new char[12] ); //数组;为定义