2013-06-28 43 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