C++で書かれたプログラムを実行しているときに、 Ubuntu 64ビット版Valgrind-3.11.0Valgrindサイズ4の無効な読み込みで、範囲外でもスタックでもない、mallocされた、または(最近)free'd
サイズ176のブロックが新たなオペレータとNのサイズが割り当てられたC++クラスのオブジェクトである8
Invalid read of size N.
Address 0xblahblah is 88 bytes inside a block of size 176 alloc'd
メッセージNが4,1の間で変化する異なるNと、次のようなエラー、範囲外のケースではないほど十分に小さいです。 なぜ、Valgrindは「積み重ねられていない」、「積み上げられていない」、「最近解放された」のような理由を教えてくれないのですか?
「スタックされていない」、「未割り当て」、「最近解放されました」などのメッセージがない場合、Valgrindがこれを無効な読み取りとして決定した理由を知っていますか?
"Nのサイズは十分に小さいので、範囲外ではありません。"非連続。 Nのサイズは通常、レジスタサイズまで2の累乗です。アクセスが範囲外であるかどうかは関係ありません。 –
@RaymondChenあなたのコメントをありがとうが、私はあなたのポイントを理解していない。 Nが8の場合、割り当てられた176バイトのブロック内にまだ88 + 8があるので、Valgrindは境界外アクセスのためにこれをエラーとして報告しないと決めました。 – nmc
ああ、大丈夫です。範囲外ではないオフセットと組み合わせたNです。あなたはNを責めようとしたので、他の部分は見ていませんでした。おそらく、それは整列エラーを報告していますか? (さらに読むと、Nは最大48であり、アライメント理論と一致しません) –