我在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 ++编写的,所以我正在标记它们)
答案 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