最近在看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的,下面这篇博文也非常适合你。