の GNU マニュアル ページでは、同じポインタ (以前に によって割り当てられたもの) で 2 回呼び出されmalloc
た場合、 「未定義の動作が発生する」と定義されています。free()
malloc()
それはどのような振る舞いですか?
この種のエラーに関する詳しい情報はどこで入手できますか?
C99 標準では、未定義の動作について次のように規定されています(「用語と定義」セクションの下)。
未定義の可能性のある動作は、状況を完全に無視して予測不能な結果をもたらすことから、翻訳中またはプログラム実行中に環境に特有の文書化された方法で動作すること (診断メッセージの発行の有無にかかわらず)、翻訳または実行の終了 (診断メッセージの発行を伴う) にまで及びます。診断メッセージの)。
要約すると、何でも起こりえます。最悪のケースは、プログラムが期待どおりに動作することです。
「未定義の動作」とは、実装が特定の方法で状況に対処する必要がないことを意味します。行動や結果はすべて「正しい」と見なされます。
free
ポインターを 2 回以上 -ing した結果は、基になる の実装次第malloc
です。その結果、クラッシュやコア ダンプが発生したり、malloc
アリーナが破損したり (将来の割り当て/割り当て解除が台無しになる)、double をfree
完全に無視したりする可能性があります。
同じポインターを同時に 2 回解放することはできません。
未定義の動作なしでそのような動作をしたい場合。
コードをすべて無料にする代わりに、次のマクロを使用できます
#define FREE(X) free(X); X=NULL
char *p;
p=malloc(50);
FREE(p);
FREE(p);
ポインターを強制NULL
的に にすると、次のフリーで未定義の動作が回避されます。free(NULL)
未定義の動作を引き起こさないためです。
「未定義の動作」は通常、プログラムがクラッシュすることを意味します。c ライブラリの実装者にとっては、そのケースを好きなように処理できることを意味します。たとえば、2 番目の無効な無料を無視することは自由です。これを行う c ライブラリはほとんどありません。ほとんどの c ライブラリは、何らかのメモリ違反エラーでプログラムを中止します。
未定義の動作とは、何でも起こり得ることを意味します。考えられる結果の 1 つは、プログラムが完全に実行されることです。もう 1 つの考えられる結果は、プログラムがクラッシュすることです。または実際にあなたが考えることができる他のもの。
未定義の動作の特定のインスタンスを分析しようとしても、洞察は得られません。free()
解決策は、 2 回電話しないことです。