最近在看STL,看到了auto_ptr,發現這個真的是個好東西,不敢自私,是以寫篇博文和大家共享。C++标準程式庫提供的auto_ptr是一種智能型的指針(smart pointer)。可以幫助程式員防止一些資源洩漏。
我們都知道在C++中用new開辟的空間是在堆上開辟的。同時,我們還知道用new開辟的空間,必須用delete來釋放,必須手動釋放。其實就這個動态開辟記憶體空間,然後又手動釋放,這個很糾結的事情就帶來了很多糾結的問題。
現在我打個比方:如果你動态開辟的空間,開辟成功了,然後也寫了釋放語句。這就是按照套路出發。是的,程式是對的,但是,你有沒有想過這樣的一個問題。
<span style="font-size:18px;">/*
*......
*/
int *p = new int[10];
/*
*.......
delete[] p</span>如此,無可厚非,但是,問題就是出現在new和delete之間了。你可以想想,你成功的在堆上開辟了空間,程式還沒有執行到delete語句的時候,程式抛出了異常,或者各種蛋疼的錯誤而退出去了。這個時候,你是不是傻眼了,是的,這個問題的确很難解決。既然有了問題,那麼肯定又解決問題的方法了,出現異常了,那麼我們就可以捕捉異常。如下:<span style="font-size:18px;">/*
ClassB *b = new ClassB();
try
{
...
}
catch (...) //for any exception
delete b;
throw;
delete b; //clean up on normal
*/</span>如此,捕捉各種異常,然後在異常中删除開辟的空間。貌似很完美,是的,程式的備援度将大大的增加,同時程式的易讀性也不好。同時,對于一個大的項目來說,這種方法并不可取。
是的,神一樣的STL提供了auto_ptr。多麼偉大的東西。防止所謂的“記憶體洩露”,提供了更好的解決方法。我們知道STL講究的是泛型。同時這也用到了auto_ptr身上,現在我們來看看auto_ptr的力量。
<span style="font-size:18px;">#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;
}</span>
這個是auto_ptr的一個小小的例子(來自:C++标準程式庫);我們看到了,我們的确是動态開辟了空間,但是,在程式中,我們是沒有發現delete語句的,何也?是的,這就是智能指針。是的,我不能再多講了,偉大的東西不是一篇博文能講清楚的。還等什麼,你也試一試吧。如果你是剛剛進入IT的,或者即将進入IT的,下面這篇博文也非常适合你。