每日一問10 C 中的記憶體洩漏

2022-09-23 06:47:09 字數 1365 閱讀 5511

記憶體洩漏(memory leak)是指程式中已動態分配的堆記憶體由於某種原因程式未釋放或無法釋放,造成系統記憶體的浪費,導致程式執行速度減慢甚至系統崩潰等嚴重後果。記憶體洩漏不是指記憶體在物理上的消失,而是指失去了對該段記憶體的控制,因而造成了記憶體的浪費。記憶體洩漏僅僅指程式在執行時,程式退出時,os將**所有的資源。

​  記憶體洩漏產生的原因基本都是,申請的資源沒有正確的釋放。

1.程式new申請的記憶體沒有及時使用delete釋放掉 ,導致記憶體洩漏。舉一個比較極端的例子:

#include #include using namespace std;

void out_of_memory()

int main()

這段**會一直先堆區申請記憶體而不釋放,導致系統記憶體耗盡,隨後申請記憶體失敗,並呼叫out_of_memory,輸出記憶體已耗盡。

2.使用new建立了一組物件陣列,記憶體**的時候卻只呼叫了delete而非delete 來處理,導致只有物件陣列的第一個物件的解構函式得到執行並**了記憶體,而陣列的其他物件的記憶體得不到**,導致記憶體洩露。

class object1

;int main()

3.除了上面介紹的堆記憶體洩漏(heap leak),在使用系統資源沒有正常釋放,也導致系統資源釋放。如使用套接字、檔案描述符、管道等系統資源後,沒有使用對應的函式釋放掉,導致系統資源的浪費,嚴重可導致系統效能減少,系統執行不穩定。4.沒有將基類的解構函式定義為虛擬函式。當基類指標指向子類物件時,如果基類的解構函式不是virtual,那麼子類的解構函式將不會被呼叫,子類的資源沒有正確是釋放,因此造成記憶體洩露。

5.對於物件陣列,只釋放了陣列,卻沒有逐個釋放陣列中的物件。

6.使用形如int a = *new int(1);的**,這句**在c++中是不會報錯的,意為使用new申請一個int物件,初始化為0,並將0值賦給變數a。

大部分記憶體洩漏,都是在程式設計過程中沒有正確使用導致的,使用stl智慧指標以及各種容器類可以很大程度上避免這種記憶體洩漏。對於系統資源的釋放使用rall也可以很大程度避免。

參考部落格:

1. c++造成記憶體洩漏的原因彙總:_蓋伊福克斯-csdn部落格_c++記憶體洩漏

​  2.c++中記憶體洩漏的幾種情況 - 小時候挺菜 - (cnblogs.com)