使用libproc时如何正确释放内存

时间:2013-06-28 07:32:05

标签: c++ c

我在http://ewencumming.blogspot.cz/2012/02/list-processes-using-libproc.html上关注了示例,以浏览Linux内核上的运行进程。但是我发现代码有泄漏:

#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);
}

在循环中运行此代码(整个main)是分配内存但它没有释放它。

根据libproc的源代码中的注释freeproc()应该在某处调用,但是在任何地方调用它只会使应用程序崩溃(当readproc缓冲区返回NULL时应调用它)。

如何正确释放readproc分配的内存? (该库在c中,但我编写的代码是用c ++编写的,所以我正在标记它们)

1 个答案:

答案 0 :(得分:2)

来自the manpage

  

readproc读取与PT中指定的条件匹配的下一个进程的信息,并将它们填充到proc_t结构中。 如果return_buf不是NULL,则会使用return_buf指向的结构。否则它将分配一个新的proc_t结构并返回指向它的指针。请注意(如果在PT中指定的话)readproc,如果它填入environ的{​​{1}}或cmdline部分,则始终会分配内存。 < / p>      

proc_t释放为freeproc结构proc_t分配的所有内存。

您正在使用*p“填写PROC_FILLARG的{​​{1}}部分,因此最终的粗体句子已激活。这意味着结构由cmdline分配,但是你忽略了可以找到指向这个结构的指针的返回值;这个结构与你正在使用的结构不同,后来试图释放 - 永远不会释放具有自动存储持续时间的对象(“堆叠“)!这就是你崩溃的原因。

您应该将proc_t的返回值赋给指针,并使用:

readproc