boost库在工作(3)作用域智能指针scoped_ptr之二

来源:互联网 发布:麻将源码 net unity 编辑:程序博客网 时间:2024/06/14 15:00

智能指针的原理,其实就是利用C++的一个特性,当对象创建时,一定会调用构造函数;当对象离开作用域时,会自动调用析构函数。由于这两个函数的调用都是由编译器来生成的,不用怕不调用的危险,达到安全删除的目的。当然,智能指针使用了一个对象的构造和析构,显示增加了一些开销,但比起垃圾回收机制来说,是非常小的,基本可以忽略不计。

 

既然智能指针已经有这么多优点,迫不及待了吧,怎么样使用呢?下面就先来看看std::auto_ptr是怎么样使用的,如下例子:

int _tmain(int argc, _TCHAR* argv[]){{     //一般的方式     int* pVal = new int;     *pVal = 10;      std::cout<< *pVal<< std::endl;     //在这里明确地删除。     delete pVal;} {     //智能指针的方式     std::auto_ptr< int >nVal(new int);     *nVal =  10;      std::cout<< *nVal<< std::endl;}//当离开这个作用域时,nVal智能指针就会自己删除已经分配的内存。 system("PAUSE");return 0;}

从上面的例子,可以看出,智能指针的方式,就比一般的方式少调用了删除的操作,这样当离开智能指针对象创建的作用域时,就会自己删除相应的资源。还会有一个意外的发现,就是智能指针与一般的指针是一样的使用方法,一点区别都没有,都是同样的操作。其实这背后使用了C++操作符重载的特性,std::auto_ptr类模板实现相应的指针操作符的功能,让智能指针具有一般指针的行为,达到以假乱真的目标。由于std::auto_ptr是使用模板的功能实现,可以适用任何非数组类型的指针。这里特别地指出,是非数组类型的指针,为什么是非数组的指针呢?原因很简单,看看一般的指针与数组指针在删除时的区别就了解,如下:

delete pVal;

delete[] pArray;

在C++里删除非数组指针,不需要使用中括号,而删除数组是需要的。而在智能指针里没有办法识别那一个指针是一般指针,那一个是数组指针。你也许会问难道数组指针,就不能使用智能指针吗?当然是可以的,后面会介绍boost库的数组的智能指针,可见,boost库提供了STL库没有提供的指针,更加丰富多彩,功能更加强大,不愧为C++里最为强大的类库了。


原创粉丝点击