STL之防止內存泄露
可以自由分配和釋放內存造就了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這樣的強大工具,我們沒必要再重造車輪了,直接拿來主義就好了。