天天看點

智能指針之auto_ptr

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

​​​​