28

多くのCコード解放ポインター呼び出し:

if (p)
  free(p);

しかし、なぜ?私はC標準freeがNULLポインターを与えられた関数は何もしないと言っていると思いました。では、なぜ別の明示的なチェックを行うのでしょうか。

4

8 に答える 8

26

コンストラクト:

free(NULL);

Dennis Ritchie によって書かれた元の UNIX コンパイラに戻って、C では常に OK でした。標準化前には、一部の貧弱なコンパイラはそれを正しく処理していなかった可能性がありますが、最近では、合法的に C 言語のコンパイラと自称できないコンパイラがあります。これを使用すると、通常、コードがより明確で保守しやすくなります。

于 2009-12-16T12:01:59.933 に答える
17

私が理解しているように、NULLのノーオペレーションは常にそこにあるとは限りませんでした。

Cの古き良き時代(1986年頃、ANSI以前の標準ccコンパイラでは)、free(NULL)はコアをダンプしていました。そのため、ほとんどの開発者は、freeを呼び出す前にNULL/0をテストしました。

世界は長い道のりを歩んできました、そして私達はもうテストをする必要がないようです。しかし、古い習慣は一生懸命に死にます;)

http://discuss.joelonsoftware.com/default.asp?design.4.194233.15

于 2009-12-16T04:42:26.860 に答える
10

if (p) free(p)必要ないとわかっていても、「」と書く傾向があります。

昔、セグメンテーション違反になるCを学んだので、部分的に自分を責めfree(NULL)ていますが、それをしないとまだ不快に感じます。

しかし、私はまた、一貫性がないことでC標準を非難します。たとえば、fclose(NULL)は明確に定義されているので、次のように記述しても問題はありません。

free(p);
fclose(f);

これは、物事を片付けるときに非常に頻繁に起こることです。残念ながら、書くのは奇妙に思えます

free(p);
if (f) fclose(f);

そして私は

if (p) free(p);
if (f) fclose(f);

私は知っています、それは合理的な理由ではありませんが、それは私の場合です:)

于 2009-12-16T11:41:24.080 に答える
0

free(0) が OKAY であることに依存しており、この時点でポインターが null になるのは正常な場合は、コメントでそのように言ってください。// may be NULL

これは単なる自明のコードかもしれません。はい、知っています。フラグとして p も使用します

于 2009-12-16T11:46:42.827 に答える
0

モバイル環境では、free() のカスタム実装が存在する可能性があります。その場合、free(0) は問題を引き起こす可能性があります。(ええ、悪い実装)

于 2009-12-16T12:31:23.410 に答える