2011-03-23 104 views
0

我有8GB的RAM和我有80GB 的硬盤我有一些三種方案內存泄漏 - 它們何時發生?

1)

main() 
{ 

while(1) 
x(); 
} 

x() 
{ 
printf("hello\n"); 
} 

將出現在這裏是一個內存泄漏在上面的程序?我想沒有!如果它沒有發生,那麼會發生什麼?何時停止?

2)

main() 
{ 
int *x; 
while(1) 
x=malloc(100*size(int));//there is a memory leak here 
} 

its obvious that this program will crash after some time but i want to know when looking at the resources i mentioned above. 

3)

main() 
{ 
x(); 
} 
x() 
{ 
x(); 
} 

這上面的程序是無限遞歸?到底會發生什麼時,這會程序崩潰/死機考慮resouces我有嗎?

+1

我有一個問題給你。當你嘗試這些程序時會發生什麼?多久時間? – 2011-03-23 10:03:45

+0

這些是三個不同的(相關問題),其中一些是無法解析的(特別是2取決於您的配置,操作系統位數,甚至編譯器選項)。甚至更多的是,在答案中實際上幾乎沒有任何價值...... – 2011-03-23 10:04:05

+2

如果沒有正確的縮進,代碼就接近「難以閱讀」。 – Vatine 2011-03-23 10:04:31

回答

3

沒有在第一個程序沒有內存泄漏,它會永遠運行(或直到它從外面殺死),高興地打印該字符串。

還有第二次內存泄漏但不會崩潰。你只需從malloc開始獲得NULL。否則,與上面的數字1相同的效果。

第三個最終會溢出堆棧,除非在編譯器中有一些特別好的尾端遞歸優化,在這種情況下它也會永遠運行。

順便說一下,該代碼特別糟糕。自從默認返回類型和沒有兩個規範參數列表的函數都可以接受以來,這已經很長時間了。

+0

你提到的這一點很有趣!「第二個內存泄漏,但不會崩潰」。這是真的嗎?第二個程序不會崩潰? – Vijay 2011-03-23 10:14:39

+0

+1爲唯一完全正確的答案 – 2011-03-23 10:15:12

+0

@ zombie,這是正確的,它不會崩潰。所有將發生的事情是,你會耗盡堆並開始回NULL。現在,如果你試圖去記住那個記憶,那將是另一回事。 – paxdiablo 2011-03-23 11:35:48

2
  1. 無內存泄漏。該計劃將永不停止。
  2. 這是內存泄漏。在程序工作中,您正在分配內存,但在下一步之後,您沒有任何指向要刪除的內存的指針。當內存完成時,這會引發「壞分配」錯誤。
  3. 在這裏你沒有內存泄漏,但是當堆棧的內存完成時程序會崩潰。
+0

這就是我的問題!!!我有一個8GB的RAM!什麼時候會崩潰? – Vijay 2011-03-23 10:09:52

+0

恰恰相反,OP在懷疑。 2)不會崩潰 – 2011-03-23 10:10:35

+0

@ zombie 3)取決於堆棧的大小。內存大小無關緊要。 – 2011-03-23 10:11:22

3

當您使用malloc()請求內存並且沒有free()內存時,會發生內存泄漏。

不好的例子

#include <stdlib.h> 

int main(int argc, char *argv[]) { 
    int *nums = malloc(10 * sizeof(int)); // create array with memory for 10 nums 
    nums[0] = 2; 
    nums[4] = 8; 

    return 0; // main() ended but nums wasn't free'd. Memory leak/ 
} 

很好的例子

#include <stdlib.h> 

int main(int argc, char *argv[]) { 
    int *nums = malloc(10 * sizeof(int)); // create array with memory for 10 nums 
    nums[0] = 2; 
    nums[4] = 8; 

    free(nums); // free memory allocated for nums 

    return 0; 
} 

現在關於你的程序。

1 - 重新格式化

此程序將永遠不會結束,永遠叫X(因而打印的Hello World,直到時代的結束!)

#include <stdio.h> 

void x(void) { 
    printf("Hello World!\n"); 
} 

int main(int argc, char *argv[]) { 
    while (1) x(); 
    return 0; 
} 

2 - 格式化

此程序分配每個循環100個整數的內存,但永遠不會釋放這個內存。巨大的內存泄漏一直持續到操作系統內存不足。

#include <stdlib.h> 

int main(int argc, char *argv[]) { 
    int *x; 
    while (1) { 
     x = malloc(100 * size(int)); // allocate memory for an array of 100 integers 
    } 

    return 0; 
} 

3 - 格式化

該程序保持遞歸直到堆棧耗盡(堆棧跟蹤),程序會崩潰(堆棧溢出)。

void x(void) { 
    x(); 
} 

int main(int argc, char *argv[]) { 
    x(); 

    return 0; 
} 
+0

其實你的壞榜樣並沒有那麼糟糕。當程序結束時,無論程序是否明確釋放它們,這些字節都將被釋放。內存泄漏只是程序繼續運行時的一個問題。當它終止時,操作系統回收分配給它的所有內存。 – aroth 2011-03-23 10:17:27

+0

@aroth:取決於操作系統,不受C標準的保證。 – orlp 2011-03-23 10:18:56

+1

C標準所說的不應該是什麼(並且C標準不應該對程序終止時操作系統所做的任何事情做出保證)。 OS處理可執行代碼,並且無法知道程序X是用C編寫的。如果操作系統在程序終止後留下任何駐留在內存中的東西,那麼這是操作系統中的一個bug,並且與任何程序做了或沒有做。 – aroth 2011-03-23 10:22:50