auto_ptr智能指针(1)
1、auto_ptr的设计动机。
主要动机是,帮助程序员防止“被异常抛出时发生资源泄漏”。比如,我们在定义了一个指针进行了new操作,正常情况下应该在结束后进行delete操作,但由于某种原因,在执行过程中出现异常,并期间结束,无法执行到delete操作,如是便产生了资源泄漏。
1 void f(){ 2 ClassA* ptr = new ClassA; //create an object explicitly 3 4 ...... //perform some operations 5 6 delete ptr; //clean up(destroy the object explicitly) 7 }
当然,该函数正常结束时不会产生任何问题。但是,如果函数在执行操作时,发生异常而退出时,这是问题就来了,无法delete我们用new操作建立的对象,从而发生了资源泄漏。为了防止这种情况,下面给出了两种方法。
注意:auto_ptr包含在memory头文件中,因此需要包括头文件#include<memory>
2、auto_ptr的初步了解
首先,应该明确的是,auto_ptr本身就是区域变量,所以无论是正常推出,还是异常退出,只要函数退出,他就一定被销毁。下面来看一段代码:
1 void f(){ 2 ClassA *ptr = new ClassA;//create an object explicitly 3 try { 4 ...... //perform some operations 5 } 6 catch(......){ //for any exception 7 delete ptr; //-clean up 8 throw; //-rethrow the exception 9 } 10 11 delete ptr; clean up on normal end 12 }
see,为了在异常发生时处理对象的删除工作,程序代码变得多么复杂和累赘。如果使用auto_ptr情况就不一样了。
1 void f(){ 2 std ::auto_ptr<ClassA> ptr(new ClassA); 3 4 ....... //perform some operations 5 }
这里不再需要delete,也不需要catch了。当出现异常或者正常结束,都能确保资源释放了。那么,这是怎么样实现的?
实际上,auto_ptr是这样一种指针,他是“所指向对象”的拥有者(owner)。也就是从上述代码2中,我们通过new操作定义了一个ClassA对象,而ptr指向这个对象。换句话说,ptr是该对象的拥有者,一旦ptr被销毁,该对象也就会被销毁。
注意:auto_ptr要求一个对象只能拥有一个拥有者,即不能存在“一物二主”的现象。
auto_ptr的定义和赋值操作,auto_ptr不允许使用一般的指针惯用的赋值操作:
std::auto_ptr<ClassA> ptr1(new ClassA) //OK std::auto_ptr<ClassA> ptr2 = new ClassA; //ERROR
要守护,就守护到底,
一但放弃,就别在回头!