2

次の C コードでメモリ エラーが発生しました。

#include <stdio.h>
#include <stdlib.h>

int main(int argc, char** argv){
int i;
int *a = (int *)malloc(sizeof(int) * 10);
if (!a) return -1; /*malloc failed*/
for (i = 0; i < 11; i++){
  a[i] = i;
}

for (i = 0; i < 11; i++){
printf("a[%d] = %d\n",i ,a[i] );
}
// free(a);
return 0;
}

memcheck はエラー Invalid read/write を検出し、間違いなく失われました。これは正しく、予期されたものです。

ここで、同じコードをアプリケーションの共有オブジェクト ファイル (.so) に追加しました。このアプリケーションはサービスとして実行され、デーモン プロセスです。それは決して終了しません。アプリケーションに valgrind を適用し、変更した '.so' を呼び出しました。

Memcheck は無効な読み取り/書き込みエラーを検出しますが、これらのエラーはすべて 1 つのメソッドに含まれていますが、確実に失われるわけではありません。

PVよろしくお願いします

4

3 に答える 3

7

valgrind は、割り当てられたメモリを追跡できなくなったことをどのように知ることができますか? プログラムの最後で、メモリが割り当て解除されていないことがわかりますが、これができることのすべてです。そして、プログラムが決して終了しない場合、valgrind は、後で割り当てを解除する必要があると考えます。

valgrind がすべての変数を検査し、誰も割り当てられたメモリの先頭を指していないことを検出しようとしても、アドレスを何らかの変更された形式で保存することは完全に正当です。たとえば、実際の先頭を過ぎたバイト (パスカル文字列を考えてください)。そのため、valgrind は、割り当てられたメモリをコードがまだ認識しているかどうかを検出できません。したがって、valgrind はこの方法でもあなたを助けることができませんでした。

于 2012-04-26T11:38:01.680 に答える
0

実際に valgrind にリークを検出させるには、別の値を に変更する必要がありますa

追加してみてください:

a = NULL;

for() ループの後。

これで valgrind が文句を言うはずです! 記憶を見失わ
ない限り、記憶を「取り返しのつかないほど失った」とは言いません。

于 2012-04-26T12:12:19.163 に答える
-1

私はあなたが意味すると思います

for (i = 0; i < 10; i++)

ただし、

#define N 10

また

const int N = 10;

Nコードの先頭で、.ではなく記号を使用します10

于 2012-04-26T11:56:21.513 に答える