6

valgrindで最後の「完了」メッセージを受け取り、次の終了レポートを受け取ります。

==3434== HEAP SUMMARY:
==3434==     in use at exit: 8,432 bytes in 4 blocks
==3434==   total heap usage: 4,369 allocs, 8,037 frees, 377,356 bytes allocated
==3434== 
==3434== LEAK SUMMARY:
==3434==    definitely lost: 152 bytes in 1 blocks
==3434==    indirectly lost: 0 bytes in 0 blocks
==3434==      possibly lost: 0 bytes in 0 blocks
==3434==    still reachable: 8,192 bytes in 2 blocks
==3434==         suppressed: 88 bytes in 1 blocks
==3434== Rerun with --leak-check=full to see details of leaked memory
==3434== 
==3434== For counts of detected and suppressed errors, rerun with: -v
==3434== ERROR SUMMARY: 100190 errors from 140 contexts (suppressed: 0 from 0)

しかし、valgrindなしで実行すると、すぐにsegfaultが発生します。valgrindは私が探しているべきある種のエラーを抑制しますか?これに関する情報がオンラインで見つかりません

4

3 に答える 3

5

Valgrindは、シェルから実行する場合とは異なる環境でプログラムを実行します。これにより、メモリの枯渇やアレイのアウトバウンドに関連するクラッシュを防ぐことができます。

エラーの140のコンテキストを修正すれば、大丈夫です。

于 2012-06-12T13:10:00.757 に答える
3

Memcheckは完全な境界チェックを実行しません。また、Memcheckには独自のメモリアロケータがあるため、他の方法で発生する障害を抑制する可能性があります。代わりにデバッガーを使用してください。

于 2012-06-12T12:53:46.770 に答える
2

Valgrindによって検出されないことがあるエラーの1つの例は、メモリを解放してから、同じ場所を指している別のポインタを介してそれを参照する場合です。

なぜこれが起こるのかわかりません。おそらく、Valgrind環境は、メモリの割り当てと割り当て解除を異なる方法で処理します。[エレグリスが言うように]

これを確認する簡単な方法は、free()関数呼び出しに一時的にコメントを付けて、それでもsegfaultが発生するかどうかを確認することです。[修正したら、後でコメントを外してください!]

于 2016-01-28T09:49:40.037 に答える