2017-08-30 70 views
-2

我有一個C++程序,其駐留內存增加緩慢,而其虛擬內存基本上保持不變。那麼這是內存泄漏嗎?C++:當駐留內存緩慢增加時是否存在內存泄漏?

閱讀一些文章,並運行一些測試後,我發現,如果空閒內存是2G(使用free命令),並運行此代碼:

int main() { 
    while (1) { 
     int* a = new int[100000]; 
    } 
} 

使用top命令可以看到駐地記憶小於2G,並保持不變,但虛擬內存增長如此之快。

所以無論我可以說,

  • 當有內存泄漏,虛擬內存必須增加。

  • 但如果駐留內存上上下下,虛擬內存保持不變,它不是內存泄漏

編輯:我做這在Linux上

我重寫我的代碼:

#include <iostream> 
int main() { 
    while (1) { 
     int* a = new int[100000]; 
     std::memset(a, 0, sizeof(a)); 
     a[0] += 1; 
    } 
} 

和免費命令: total used free shared buffers cached Mem: 3 0 3 0 0 0 -/+ buffers/cache: 0 3 Swap: 3 0 3

當運行代碼以上:

PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
8518 wq 20 0 358g 2.9g 704 R 53.9 73.8 0:09.13 a.out

RES增加至〜3G,然後停止,也如下代碼:

#include <iostream> 
int main() { 
    while (1) { 
     int* a = new int[100000]; 
    } 
} 

所以最後一個問題,在這種方式駐留存儲器增加,但不是虛擬的,我可以說可能是空閒的內存增加,操作系統可以分配更多的物理內存進度

+2

您正在運行的操作系統/運行時足夠聰明,可以注意到您從未實際使用過您分配的內存。它只會將記憶標記爲「保留」給你,但在你使用它之前不會實際給你。嘗試將一些數據寫入分配的內存並查看它的變化。 – nwp

+4

有一個'new'沒有匹配'delete'就是內存泄漏,句號。 – NathanOliver

+3

這是一個沒有明顯副作用的無限循環。這是未定義的行爲。 –

回答

2

你沒有提到你的平臺。在像Linux這樣的系統上,有一個懶惰的內存分配器。這意味着如果你調用new來分配未初始化的內存(就像你的int數組一樣),那麼將分配虛擬內存,但不分配物理內存。稍後,如果您確實爲內存分配了一個值,那麼它將得到分配。

正如nwp所說,嘗試將值分配給您分配的內存(通過使用類似memset或使用具有初始化類成員的構造函數的類)。