最近在看STL,看到了auto_ptr,发现这个真的是个好东西,不敢自私,所以写篇博文和大家共享。C++标准程序库提供的auto_ptr是一种智能型的指针(smart pointer)。可以帮助程序员防止一些资源泄漏。
我们都知道在C++中用new开辟的空间是在堆上开辟的。同时,我们还知道用new开辟的空间,必须用delete来释放,必须手动释放。其实就这个动态开辟内存空间,然后又手动释放,这个很纠结的事情就带来了很多纠结的问题。
现在我打个比方:如果你动态开辟的空间,开辟成功了,然后也写了释放语句。这就是按照套路出发。是的,程序是对的,但是,你有没有想过这样的一个问题。
/*
*......
*/
int *p = new int[10];
/*
*.......
*/
delete[] p
如此,无可厚非,但是,问题就是出现在new和delete之间了。你可以想想,你成功的在堆上开辟了空间,程序还没有执行到delete语句的时候,程序抛出了异常,或者各种蛋疼的错误而退出去了。这个时候,你是不是傻眼了,是的,这个问题的确很难解决。既然有了问题,那么肯定又解决问题的方法了,出现异常了,那么我们就可以捕捉异常。如下:
/*
*......
*/
ClassB *b = new ClassB();
try
{
...
}
catch (...) //for any exception
{
delete b;
throw;
}
delete b; //clean up on normal
/*
*......
*/
如此,捕捉各种异常,然后在异常中删除开辟的空间。貌似很完美,是的,程序的冗余度将大大的增加,同时程序的易读性也不好。同时,对于一个大的项目来说,这种方法并不可取。
是的,神一样的STL提供了auto_ptr。多么伟大的东西。防止所谓的“内存泄露”,提供了更好的解决方法。我们知道STL讲究的是泛型。同时这也用到了auto_ptr身上,现在我们来看看auto_ptr的力量。
#include <iostream>
#include <memory>
using namespace std;
template <class T>
ostream& operator<< (ostream& strm, const auto_ptr<T>& p)
{
if (p.get() == NULL)
{
strm<<"NULL";
}
else
{
strm<<*p;
}
return strm;
}
int main()
{
const auto_ptr<int> p(new int(42));
const auto_ptr<int> q(new int(0));
const auto_ptr<int> r;
cout<<"after initialization:"<<endl;
cout<<"p: "<<p<<endl;
cout<<"q: "<<q<<endl;
cout<<"r: "<<r<<endl;
*q = *p;
//*p = -77;
cout<<"after assigning values: "<<endl;
cout<<"p: "<<p<<endl;
cout<<"q: "<<q<<endl;
cout<<"r: "<<r<<endl;
}
这个是auto_ptr的一个小小的例子(来自:C++标准程序库);我们看到了,我们的确是动态开辟了空间,但是,在程序中,我们是没有发现delete语句的,何也?是的,这就是智能指针。是的,我不能再多讲了,伟大的东西不是一篇博文能讲清楚的。还等什么,你也试一试吧。如果你是刚刚进入IT的,或者即将进入IT的,下面这篇博文也非常适合你。