2011-10-18 91 views
3

我正在做一個家庭作業,需要我編寫一個泄漏內存的程序,記錄它泄漏的內存量,直到它崩潰。如何跟蹤有多少內存泄漏?

我對程序的一般想法是不斷地重新分配一個malloc指針。

這裏是我到目前爲止的代碼:

char *oldMemory = malloc(125000); //1MB of memory. 
char *newMemory = malloc(125000); 
oldMemory = newMemory; 
  • 的是,有辦法把這個循環和重複孤兒一個 一定數量的內存,直到程序不再分配任何內存和崩潰?
  • 如何在程序崩潰之前跟蹤有多少內存泄漏?

感謝您的時間和專業知識!

+1

'malloc(125000)'會給你125,000字節,即約122KB。遠不及1MB。 –

+0

你說得對。我將其輸入[WolframAlpha](http://www.wolframalpha.com)將該值轉換爲字節,而我必須使用megabits。 –

+0

只是爲了好玩:'while(new int);' –

回答

4
  1. 是的。
  2. 計算泄漏分配的大小。

不要忘記打印每次迭代時泄漏的大小 - 所以即使程序崩潰,您也會看到結果。如果您在訪問它之前測試失敗的分配,程序不應該崩潰。

因此:

#include <stdlib.h> 
#include <stdio.h> 
#include <string.h> 

enum { ALLOCSIZE = 125000 }; 

int main(void) 
{ 
    long long size = 0; 
    char *space = malloc(ALLOCSIZE); 
    while (space != 0) 
    { 
     size += ALLOCSIZE; 
     printf("OK %lld\n", size); 
     memset(space, '\0', ALLOCSIZE); 
    } 
    return(0); 
} 

Linux的OOM可能會混淆的東西;它允許過度承諾內存。您必須在泄漏之前訪問分配的內存 - 因此需要memset()(或者您可以使用calloc()而不是malloc())。

+0

我試着用allocsize這個代碼作爲long long = 12500000000000000,內存使用量達到192,248KB。我現在在Windows 7上運行它,如果有幫助的話。 –

+0

不用直接使用'malloc' /'free',你可以編寫自己的函數來添加/減去「未知字節」變量。將這個變量靜態保存在你定義這些函數的文件中是有意義的。這樣,如果值非零,你就知道你已經分配了一些東西而不釋放它。 –

0

當你在C中分配一些內存塊時,你應該負責使用 free()函數釋放它。
如果你想確保你的程序不會因爲內存泄漏而崩潰。
請求更多內存或使用分配的內存時,可以使用assert()函數。
你應該檢查從malloc返回的返回指針,如果它是NULL,那麼分配失敗。 >>請注意,linux內核malloc()由於「內存過量使用」而不會返回NULL

+0

他正試圖泄漏內存並需要跟蹤泄漏的內存。 –