1. ホーム
  2. c

[解決済み] ptr が NULL の場合の free(ptr) はメモリを破壊するか?

2022-06-04 01:41:18

質問

理論的には以下のようになります。

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 がヌルポインタの場合、何も起こりません。

参照 ISO-IEC 9899 .

とはいえ、野生のさまざまなコードベースを見ていると、人々が時々そうしていることに気づくでしょう。

if (ptr)
  free(ptr);

これは、いくつかの C 言語のランタイム(PalmOS では確かにそうだったように記憶しています)が NULL ポインタを解放するときにクラッシュしてしまうからです。

しかし、現在では、安全なものとして free(NULL) は、規格の指示通りnopとするのが無難でしょう。