2

Linux カーネルで実行中のプロセスを参照するために、 http://ewencumming.blogspot.cz/2012/02/list-processes-using-libproc.htmlの例に従いました。ただし、コードにリークがあることがわかりました。

#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へのポインターを返します。PT( で指定されている場合)は、 のまたはの一部をreadproc埋める場合、常にメモリを割り当てることに注意してください。environcmdlineproc_t

freeprocproc_tstructに割り当てられたすべてのメモリを解放します*p

PROC_FILLARGwhichcmdlineを使用して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 に答える