cの使用:
char ptr[n];
free(ptr);
私の意見では、「charptr[n];」の場合 が使用され、メモリが割り当てられ、ptrがポイントされている場合、free(ptr)が機能するはずです。そして、プログラムは失敗しました、なぜですか?(n == 5例)深い分析はありますか?
cの使用:
char ptr[n];
free(ptr);
私の意見では、「charptr[n];」の場合 が使用され、メモリが割り当てられ、ptrがポイントされている場合、free(ptr)が機能するはずです。そして、プログラムは失敗しました、なぜですか?(n == 5例)深い分析はありますか?
free
が割り当てられていない変数を呼び出したためですmalloc
。
これにより、未定義動作が発生します。幸いなことに、クラッシュして検出できます。そうでない場合は、ほとんどの場合、厄介なときにクラッシュする可能性があります。
ヒープに割り当てられた変数のメモリの割り当てを解除する必要がありますfree
。ローカルストレージ上の配列(関数内にあると想定)があり、作成されたscope({
、}
)が終了すると自動的に割り当てが解除されます。
これは未定義の動作であるため、実行していることです。(これは、クラッシュ、一見正常に実行されている、デーモンを鼻から飛ばすなど、文字通り何でもできることを意味します。)free()
を使用して取得したポインターのみを使用できますmalloc()
。
自動配列はfree()'dである必要はありません。スコープが終了すると、割り当てが解除されます。
free
によって割り当てられたオブジェクトのみmalloc
。によって割り当てられていないオブジェクトを解放することmalloc
は、未定義の動作です。
これは、c ever fail(SO)でfreeを呼び出すことができるのと似ています
。動作は標準に従って定義されていません。場合によっては、コードがすぐにクラッシュしないことがあります。ヒープが破損し、実行の非常に遅い時間にクラッシュし、デバッグが困難になる可能性があります。
ある意味で、malloc/freeメソッドの設計に依存します。
私が知っている1つの方法は、次のとおりです。各mallocで、malloc()によって返されるブロックに追加のメモリブロックがアタッチされます。このブロックには、free()の呼び出し中に必要なハウスキーピングデータが含まれています。あなたの場合、メモリがmalloc()によって割り当てられていないため、このデータが欠落しています。そのため、free()は、そのジャンクを知らずに、配列の前にあるデータを使用しようとしています。
`char ptr[n];'のため はスタックメモリ内の配列を宣言するために離れており、ブロックのスコープを持っています。つまり、ブロックが終了するとメモリから破棄されます。
ただしmalloc(size)
、ポインタを使用すると、HEAPメモリ内のメモリの一部を指し、プログラマーが指定したスコープを使用します。つまり、破壊したい場合は使用する必要があります。そうしないfree(ptr)
と、プログラムの終了後にOSが解放します。
したがって、スタックメモリ内のメモリの一部を指すポインタを使用すると、HEAPfree
メモリでのみfree
動作するため、未定義動作とプログラムのクラッシュが発生します。