2013-06-28 44 views
1

我後面的例子http://ewencumming.blogspot.cz/2012/02/list-processes-using-libproc.html爲了瀏覽正在運行的進程在Linux內核上。但是我發現代碼有泄漏:我怎樣才能正確釋放內存使用libproc

#include <stdio.h> 
#include <string.h> 
#include <proc/readproc.h> 

int main(int argc, char** argv) 
{ 
// fillarg used for cmdline 
// fillstat used for cmd 
PROCTAB* proc = openproc(PROC_FILLARG | PROC_FILLSTAT); 

proc_t proc_info; 

// zero out the allocated proc_info memory 
memset(&proc_info, 0, sizeof(proc_info)); 

while (readproc(proc, &proc_info) != NULL) { // <<!!!!!! here is the leak !!!!!! 
    // do something 
} 

closeproc(proc); 
} 

運行在一個循環的代碼(整個主)被分配內存,但它並沒有釋放它。

根據libproc的源碼中的註釋freeproc()應該在某處調用,但在任何地方調用它只會導致應用程序崩潰(應在readproc緩衝區返回NULL時調用它)。

如何正確釋放由readproc分配的內存? (該庫是在C,但代碼我寫在C++中,所以我標記兩者)

回答

2

the manpage

readproc讀取PT匹配指定的條件的下一個過程中的信息,並填充它們成爲proc_t結構。 如果return_buf不是NULL,它將使用return_buf指向的結構。否則,它將分配一個新的proc_t結構並返回一個指向它的指針。請注意(如果在PT中如此指定)readproc總是分配內存,如果它填充proc_tenvironcmdline部分。

freeproc釋放爲proc_t結構*p分配的所有內存。

您使用PROC_FILLARG其中「填補的proc_tcmdline部分,所以最後一句黑體被激活,這意味着結構是由readproc分配,但你忽略返回值,其中指針可以找到這個結構體;這個結構體與你正在使用的結構體不同,後來試圖釋放它們從不釋放一個具有自動存儲持續時間的對象(「在堆棧上」)!這就是爲什麼你會遇到崩潰。

您應該將返回值return_buf指定給指針,並使用該指針:

int main(int argc, char** argv) 
{ 
// fillarg used for cmdline 
// fillstat used for cmd 
PROCTAB* proc = openproc(PROC_FILLARG | PROC_FILLSTAT); 

while (proc_t* proc_info = readproc(proc, NULL)) { 
    // do something 
    freeproc(proc_info) 
} 

closeproc(proc); 
} 
+0

謝謝,只是爲了更好地理解這一點,如果我真的在proc_info.cmdline上做了一個免費的工作,它是否也可以解決問題? – Petr

+0

此外,我不知道你的代碼是否正確,readproc()沒有候選人只有一個參數,我想你的意思while(readproc(proc,proc_info)!= NULL)? – Petr

+0

無論如何,使用readproc(proc,proc_info)總是把NULL放到proc_info :(它不工作... – Petr