10

valgrindがメモリリークを次のように分類していることを確認しました。

  • 間違いなく失われた
  • 間接的に失われた
  • 失われた可能性があります
  • まだ到達可能
  • 抑制

「失われた可能性がある」が主な問題であったリークを修正しました。

ドキュメントには次のように書かれています。「失われた可能性があるということは、割り当てられたブロックの中央を指す可能性のあるポインタを使って異常なことをしている場合を除いて、プログラムがメモリリークを起こしていることを意味します。考えられる原因については、ユーザーマニュアルを参照してください。

「割り当てられたブロックの中央を指す可能性のあるポインタを使用して異常なことを行う」例を教えてください。

valgrindによって報告されているにもかかわらず、「おそらく失われた」を無視できる例を意味します。ポインターを使用するとvalgrindに不満が出るが、同時にそのようにポインターを使用することは、どういうわけか正当な例です。

ありがとうございました

4

3 に答える 3

9

ドキュメントが独自のアロケータを持ち、返されるメモリが直接基になるOSアロケータ(malloc / sbrk)によって返されるポインタではなく、オフセットの後のポインタであるさまざまなライブラリの例。たとえば、追加のメモリを取得してメタ情報(ガベージコレクタのタイプ情報など)を格納したアロケータについて考えてみます。割り当てと割り当て解除のプロセスは、次のようになります。

void* allocate( size_t size ) {
   metainfo_t *m = (metainfo_t*) malloc( size + sizeof(metainfo) );
   m->data = some_value;
   return (void*)(m+1);          // [1]
}
void deallocate( void* p ) {
   metainfo_t *m = ((metainfo_t*)p) - 1;
   // use data
}
void * memory = allocate(10);

valgrindがメモリを追跡しているとき、によって返された元のポインタを記憶しておりmalloc、そのポインタはプログラムのどこにも保存されていません。しかし、それはメモリがリークされたことを意味するのではなく、ポインタがプログラムで直接利用できないことを意味するだけです。特にmemory、返されたポインタを保持し、deallocateそれを解放するために呼び出すことができますが、プログラム内のどこにもvalgrind元の返されたポインタが表示されず(char*)memory - sizeof(metadata_t)、警告が表示されます。

于 2012-07-31T12:18:17.240 に答える
5
char *p = malloc(100);
if (p != 0)
{
    p += 50;
    /* at this point, no pointer points to the start of the allocated memory */
    /* however, it is still accessible */
    for (int i = -50; i != 50; i++)
        p[i] = 1;
    free (p - 50);
}
于 2012-07-31T11:23:00.597 に答える
2
char *p = malloc(100);
if (p != 0)
{
    p += 50;
    /* at this point, no pointer points to the start of the allocated memory */
    /* however, it is still accessible */
    for (int i = -50; i != 50; i++)
        p[i] = 1;
    free (p - 50);
}

とても面白そうなので、コードを実行してvalgrindしました。結果は次のようになります。

yjaeyong@carbon:~$ valgrind test
==14735== Memcheck, a memory error detector
==14735== Copyright (C) 2002-2010, and GNU GPL'd, by Julian Seward et al.
==14735== Using Valgrind-3.6.1-Debian and LibVEX; rerun with -h for copyright info
==14735== Command: test
==14735== 
==14735== 
==14735== HEAP SUMMARY:
==14735==     in use at exit: 0 bytes in 0 blocks
==14735==   total heap usage: 32 allocs, 32 frees, 2,017 bytes allocated
==14735== 
==14735== All heap blocks were freed -- no leaks are possible
==14735== 
==14735== For counts of detected and suppressed errors, rerun with: -v
==14735== ERROR SUMMARY: 0 errors from 0 contexts (suppressed: 11 from 6)

漏れはあり得ないと言っています。私は何かが足りないのですか?

于 2012-07-31T13:20:43.630 に答える