8

valgrind に関するいくつかの投稿を見てきましたが、valgrind の出力の解釈を理解するのに役立った投稿は 1 つもありませんでした。valgrind で 2 つのプログラムを実行しました (どちらもメモリ リークがありました)

テスト 1 のサンプル出力

==20422== LEAK SUMMARY:
==20422== definitely lost: 448 bytes in 3 blocks
==20422== indirectly lost: 786,460 bytes in 1 blocks
==20422== possibly lost: 1,576,052 bytes in 46 blocks
==20422== still reachable: 1,077,107 bytes in 2,333 blocks
==20422== suppressed: 0 bytes in 0 blocks
==20422== Rerun with --leak-check=full to see details of leaked memory
==20422==
==20422== For counts of detected and suppressed errors, rerun with: -v
==20422== ERROR SUMMARY: 98307 errors from 5 contexts (suppressed: 2 from 2)
Killed

テスト 2 の出力

==20875== HEAP SUMMARY:
==20875== in use at exit: 1,059,198 bytes in 2,047 blocks
==20875== total heap usage: 3,019 allocs, 972 frees, 4,496,090 bytes allocated
==20875==
==20875== LEAK SUMMARY:
==20875== definitely lost: 328 bytes in 2 blocks
==20875== indirectly lost: 0 bytes in 0 blocks
==20875== possibly lost: 1,600 bytes in 5 blocks
==20875== still reachable: 1,057,270 bytes in 2,040 blocks
==20875== suppressed: 0 bytes in 0 blocks
==20875== Rerun with --leak-check=full to see details of leaked memory
==20875==
==20875== For counts of detected and suppressed errors, rerun with: -v
==20875== ERROR SUMMARY: 0 errors from 0 contexts (suppressed: 2 from 2)

エラーの概要を見ると、1 つの出力はエラーがあることを示し、他の出力はエラーがないことを示しています (最終的に両方にリークがあります)。

私の質問は - - valgrind でエラーとしてカウントされるものは何ですか? (valgrind マニュアルは役に立ちませんでした)

4

1 に答える 1

6

メモリ リークはエラーとは見なされず、プログラムのロジックには影響しません。

エラーとは、無効な読み取りや書き込みなどです。

コメントの結果として更新: テスト 1 の無効な読み取りと書き込みは、98307 回アクセスされるメモリの 5 つの異なる領域に対するものです。

リークを見ると、テスト 1 の大きな間接損失は、ルートのみが削除されたリンクされたデータ構造を示している可能性があります。

テスト 2 の漏れはそれほど悪くありません。valgrind が示唆するように、 --leak-check=full を指定して再実行すると、問題の原因となっているコードのビットが示されます。

エラーの完全な説明はここにあります

于 2013-07-01T10:29:41.093 に答える