1

この問題について以前に同様のスレッドがあり、このサイトでhttps://live.gnome.org/Valgrindが説明されていたことを知っています。以下に簡単なプログラムを書きました

  #include <glib.h>
  #include <glib/gprintf.h>
  #include <iostream>

  int main()
 {
const gchar *signalfound = g_strsignal(1);
std::cout <<  signalfound<< std::endl;
return 0; 
  }

しかし、このコマンドを使用してvalgrindを使用してチェックしようとしたとき G_DEBUG=gc-friendly G_SLICE=always-malloc valgrind --leak-check=full --leak-resolution=high ./g_strsignal

そしてここに結果があります

   ==30274== Memcheck, a memory error detector
   ==30274== Copyright (C) 2002-2012, and GNU GPL'd, by Julian Seward et al.
   ==30274== Using Valgrind-3.8.1 and LibVEX; rerun with -h for copyright info
   ==30274== Command: ./g_strsignal
   ==30274== Parent PID: 5201
   ==30274== 
   ==30274== 
   ==30274== HEAP SUMMARY:
   ==30274==     in use at exit: 14,746 bytes in 18 blocks
   ==30274==   total heap usage: 24 allocs, 6 frees, 23,503 bytes allocated
   ==30274== 
   ==30274== LEAK SUMMARY:
   ==30274==    definitely lost: 0 bytes in 0 blocks
   ==30274==    indirectly lost: 0 bytes in 0 blocks
   ==30274==      possibly lost: 0 bytes in 0 blocks
   ==30274==    still reachable: 14,746 bytes in 18 blocks
   ==30274==         suppressed: 0 bytes in 0 blocks
   ==30274== Reachable blocks (those to which a pointer was found) are not shown.
   ==30274== To see them, rerun with: --leak-check=full --show-reachable=yes
   ==30274== 
   ==30274== For counts of detected and suppressed errors, rerun with: -v
   ==30274== ERROR SUMMARY: 0 errors from 0 contexts (suppressed: 0 from 0)

valgrind に「到達可能なブロック (ポインターが見つかったブロック) が表示されない」と表示されていることに気付きました。次に、glib-2.35.4 バージョンを使用したため、対応する関数で gmem.c ソースを確認しようとします。次のコードを見つけました

   gpointer
   g_malloc (gsize n_bytes)
   {
      if (G_LIKELY (n_bytes))
         {
              gpointer mem;

               mem = glib_mem_vtable.malloc (n_bytes);
               TRACE (GLIB_MEM_ALLOC((void*) mem, (unsigned int) n_bytes, 0, 0));
               if (mem)
              return mem;

               g_error ("%s: failed to allocate %"G_GSIZE_FORMAT" bytes",
                G_STRLOC, n_bytes);
           }

       TRACE(GLIB_MEM_ALLOC((void*) NULL, (int) n_bytes, 0, 0));

   return NULL;
  }

そして私の質問は

  1. これはまだ valgrind が「到達可能なブロック (ポインターが見つかったブロック) が表示されない」と言った通常の状況ですか? このステートメントは、上記の g_malloc 関数を参照していると思います。

  2. そうでない場合、valgrind が上で言ったことについて、「まだ到達可能: 18 ブロックで 14,746 バイト」という解決策はありますか?

x86 fedora 18 を実行しています ありがとう

4

1 に答える 1

1

ほとんどの場合、関数によって返される動的に割り当てられたメモリを指しますg_strsignal()
valgrindは「到達可能なブロック....」と言います。これは、有効なpointer(signalfound)が動的に割り当てられたメモリを指しているためです。
Valgrindは、動的メモリを指すポインタが失われた(上書きされた)ことを検出すると、 「明確なリーク...」を報告します。これは、メモリの動的ブロックを解放できないと結論付けることができるためです。あなたの場合、ポインターはブロックvalgrindを指しているので、それが失われたとは想定していませんが、おそらく設計によるものであると想定しています。

于 2013-01-28T13:44:32.257 に答える