讀《C專家編程》筆記-關於內存泄漏

運行一段固定的時間然後終止的程序,大多不需要擔心如何釋放內存,當程序停止時所分配的內存會被自動回收。而當程序的生存時間要長一點,這就需要管理動態內存的分配和回收。這時在使用malloc()和free()時就要非常慎重。堆經常會出現兩種類型的問題:
1.釋放或者改寫仍在使用的內存(稱爲“內存損壞”)。
2.未釋放不再使用的內存(稱爲“內存泄漏”)

如何避免內存泄漏

每次當調用malloc分配內存時,注意在以後要調用相應的free來釋放它。
如果不知道如何調用free與先前的malloc相對應,那麼很可能已經造成了內存泄漏!
一種簡單的方法就是在可能的時候使用alloca來分配動態內存,以避免上述情況。當離開調用alloca的函數時,它所分配的內存會被自動釋放。
顯然,這並不是用與那些比創建他們的函數生命期更長的結構,但如果對象的色很難過名期在該函數結束前便已停止,這種簡歷在堆棧上的動態內存分配是一種開銷很小的選擇,allocal就很難高效的實現。

如何檢測內存泄漏

觀察內存泄漏是一個兩步驟的過程。
1.首先,使用swap命令觀察還有多少可用的交換空間:
swap -s
在一兩分鐘內鍵入命令三到四次,看看可用的交換區是否在減少。還可以使用其他一些/usr/bin/*stat工具如netstat、vmstat等。如果發現不斷有內存被分配且從不釋放,一個可能的解釋就是有個進程出現了內存泄漏。
2.第二個步驟就是確定可疑的進程,看看它是不是該爲內存泄漏負責。你可能知道那個進程是罪魁禍首,不然可以使用“ps -lu用戶名”命令來顯示所有進程的大小。同樣數次重複這個命令,可以發現任何動態分配內存的進程的大小都在增長。如果一個進程看上去不斷的增長而從不縮小,它就又可能出現了內存泄漏。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章