理論的には
free(ptr);
free(ptr);
すでに解放されているメモリを解放しているため、メモリが破損しています。
しかし、どうすれば
free(ptr);
ptr=NULL;
free(ptr);
OSは未定義の方法で動作するので、何が起こっているのかについて実際の理論的分析を得ることができません。私が何をしていても、このメモリ破損はありますか?
NULLポインターの解放は有効ですか?
7.20.3.2
free
関数あらすじ
_#include <stdlib.h> void free(void *ptr);
_説明
free
関数は、ptr
が指すスペースの割り当てを解除します。つまり、さらなる割り当てに使用できるようにします。ptr
がNULLポインターの場合、アクションは発生しません。
ISO-IEC 9899 を参照してください。
そうは言っても、野生のさまざまなコードベースを見ると、人々が時々そうすることに気付くでしょう。
_if (ptr)
free(ptr);
_
これは、NULL
ポインターを解放すると、一部のCランタイム(PalmOSの場合は確かにそうだったことを覚えています)がクラッシュするためです。
しかし、最近では、free(NULL)
が標準で指示されているようにnopであると仮定するのが安全だと思います。
Cライブラリの標準準拠バージョンはすべて、free(NULL)をノーオペレーションとして扱います。
とはいえ、かつてfree(NULL)でクラッシュするfreeのバージョンがいくつかあったため、いくつかの防御的なプログラミング手法が推奨されることがあります。
if (ptr != NULL)
free(ptr);
PtrがNULLの場合、操作は実行されません。
ドキュメントを言う。
free(NULL)
がクラッシュしたPalmOSで作業したことを覚えています。
推奨される使用法:
_free(ptr);
ptr = NULL;
_
見る:
_man free
The free() function deallocates the memory allocation pointed to by ptr.
If ptr is a NULL pointer, no operation is performed.
_
free()
の後にNULL
にポインターを設定すると、その上でfree()
を再度呼び出すことができ、操作は実行されません。
free(ptr);
ptr=NULL;
free(ptr);/*This is perfectly safe */
NULLポインターを安全に削除できます。その場合、操作は実行されません。つまり、free()はNULLポインターに対して何もしません。
free(NULL)
はCでは完全に正当であり、delete (void *)0
およびdelete[] (void *)0
はC++では正当です。
ところで、メモリを2回解放すると、通常、何らかのランタイムエラーが発生するため、何も破損しません。
free(ptr)は、ptrがNULLの場合、Cに保存されますが、ほとんどの人が知らないのは、NULLが0に等しい必要はないということです。 IOポートです。このポートにアクセスするCでプログラムを作成した場合、値が0のポインターが必要になります。対応するcライブラリは、0とNULLを区別する必要があります。
敬具
メモリの破損ではありませんが、動作は実装に依存します。標準では、合法的なコードである必要があります。