2010-09-20 24 views
4

考慮這個沒有意義的程序:這會被認爲是內存泄漏嗎?

/* main.c */ 

#include <stdlib.h> 
#include <unistd.h> 

int main(int argc, char **argv) { 
    int i; 
    for (i = 0; i < 1024; i++) { 
     int pid = fork(); 
     int status; 
     if (pid) { 
      wait(&status); 
     } 
     else { 
      char *ptr = (char *)malloc(1024*sizeof(char)); 
      char *args[2] = {"Hello, world!", NULL}; 
      execve("/bin/echo", args, NULL); 
     } 
    } 
} 

會不會釋放ptr構成任何main.c中或其他程序中的內存泄漏,或者是將要釋放反正當execve的是叫什麼名字?

+0

我在'execve – pmg 2010-09-20 23:06:05

回答

10

這不是一個內存泄漏號。 exec*()將在args數組中創建一個字符串數據的本地副本,然後吹走子進程內存映像並將其與/bin/echo使用的內存映像重疊。在exec()是pid之後,基本上所有的東西都保留下來。

編輯:

User318904長大EXEC的情況下()返回-1(即,故障)。在這種情況下,已分叉但未能執行的子進程確實在技術上存在內存泄漏,但正常情況下,響應失敗的exec只是退出子進程,內存將被操作系統收回。儘管如此,解放它可能是一個很好的習慣,如果沒有其他原因,它會讓你後來不再想。

+0

之前'免費(ptr)睡得更好'謝謝。這不是我懶得添加免費(ptr)的問題。在實際的,稍微複雜的情況下,我在我的真實程序中,實際上是將一個malloc的字符串傳遞給execve,所以我無法釋放它(儘管如果execve失敗,我可以自由地調用它)。 – Nick 2010-09-21 00:06:40

+0

@Nick:內存的來源(堆棧,堆,靜態)與操作系統無關 - 它只是內存,它將被操作系統自動而輕鬆地替換和回收。 – 2010-09-21 01:08:58

0

分配的內存應該由exec釋放。通話完成後,無論如何都無法訪問。

3

當execve返回-1時,是的。否則,也許。