1

したがって、「malloc」されたメモリの途中に「\0」を配置するとどうなるか疑問に思っていました。

私はこの質問に出くわしました。文字配列を解放するときのメモリ リーク

Jesse Good's answer では、この行が「malloc」されたメモリのサイズを出力すると述べています。

std::cout << *((std::size_t*)arr - 1) << std::endl;

((std::size_t )arr - 1)の値を変更すると、「free」を呼び出したときに解放されるメモリのサイズが異なり、変更された値がより小さいとメモリ リークが発生するということですか?元の値?

4

1 に答える 1

6

あなたが言及している答えは誤解を招くものです。受け入れられた回答を読んでください。

システムが特定のメモリ アロケータを使用している場合size_t、メモリ ブロックの前の値を読み取って、そのブロックのサイズを判断できることは事実です。でも:

  • すべてのメモリ アロケータがこのように機能するわけではありません。他のメモリ ブロックへのポインターなど、その場所に他の値を格納するものもあれば、意味のあるものにはまったく使用しないものもあります。
  • 割り当てられたブロック外のメモリを読み取った結果は未定義です。状況によっては、割り当てられたブロックの前のアドレスがプロセスのメモリ空間の外にある可能性があり、それにアクセスするとセグメンテーション違反が発生します。
  • その値を変更すると、メモリ アロケータの状態が破損し、メモリの割り当てまたは解放時にプログラムが正しく動作しなくなったり、クラッシュしたりする可能性があります。

割り当てられた領域外のメモリを読み書きしないでください。

于 2013-10-11T05:25:09.917 に答える