2

我按照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);
}

在循环中运行此代码(整个主代码)正在分配内存,但不会释放它。

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

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

4

1 回答 1

2

手册页

readproc 读取与 中指定的条件匹配的下一个进程的信息,PT并将它们填充到一个proc_t结构中。如果return_buf不是NULL,它将使用 指向的结构return_buf。否则它将分配一个新proc_t结构并返回一个指向它的指针。请注意(如果在 中指定PTreadproc总是在填充 的environcmdline部分时分配内存proc_t

freeproc释放为proc_tstruct分配的所有内存*p

您正在使用PROC_FILLARGwhich " 填充 的cmdline部分proc_t,因此最后的粗体句子被激活。这意味着该结构由 分配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);
}
于 2013-06-28T07:45:22.323 回答