STL之防止記憶體洩露
阿新 • • 發佈:2019-01-08
可以自由分配和釋放記憶體造就了C++的靈活和強大,但這也是使用C++最容易出現問題的地方,記憶體洩露問題,估計程式猿都會或多或少的遇到,也遭受了很多程式猿們的深惡痛絕,無數個加班的晚上可能就是因為少了一個delete的緣故。
用過C++的人基本上都應該會了較過一個叫STL(標準模板庫)的東西,這個東西在一定程度上,更進一步推動了C++的發展和普及程式,裡面對於C++模板以及C++三大特性封裝、繼承、多型的使用可以說是淋漓盡致,具體的介紹可以參考侯捷老師的《STL原始碼剖析》。STL有一個智慧指標的東西,即auto_ptr,有了智慧指標以後,再也不用擔心忘記呼叫delete釋放堆記憶體了。auto_ptr主要是通過建構函式來繫結堆記憶體指標,當auto_ptr物件銷燬的時候,其解構函式就會釋放掉繫結的堆記憶體,示例程式碼如下:
void Func1()
{
int *ptr = new int;
//...具體函式邏輯
delete ptr; //當函式邏輯很複雜的時候,很容易忘記這一句
}
void Func2()
{
auto_ptr<int> ptr(new int);
//...具體函式邏輯
}
上面的Fun1函式在申請和釋放堆記憶體至少要兩句程式碼,而使用auto_ptr的Fun2函式只需要一句程式碼就可以了,還能保證在退出作用於的時候自動釋放申請的記憶體空間,既乾淨又環保。
auto_ptr的實現就是《Effective C++》提到的以物件管理資源的方法,眾所周知,類物件在退出其作用域時,會自動呼叫其解構函式,我們可以充分利用編譯器提供的便利,在物件的建構函式生產資源,在物件的解構函式釋放資源,這樣就不用擔心忘記釋放資源了,但是既然有了auto_ptr這樣的強大工具,我們沒必要再重造車輪了,直接拿來主義就好了。