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

 

posted @ 2013-11-07 15:52  蜗牛骑士  阅读(465)  评论(0编辑  收藏  举报