例えば:
char * myString = malloc(sizeof(char)*STRING_BUFFER_SIZE);
free(myString);
free(myString);
これを行うことによる悪影響はありますか?
例えば:
char * myString = malloc(sizeof(char)*STRING_BUFFER_SIZE);
free(myString);
free(myString);
これを行うことによる悪影響はありますか?
章と節はこちら。
[関数への] 引数が、 、、または 関数
free
によって以前に返されたポインターと一致しない場合、またはの呼び出しによってスペースが割り当て解除された場合、動作は未定義です。( ISO 9899:1999 -プログラミング言語 — C、セクション 7.20.3.2)calloc
malloc
realloc
free
realloc
何もない、サイレントメモリ破損、またはセグメンテーション違反のいずれかです。
はい、プログラムをクラッシュさせるダブルフリーエラーが発生する可能性があります。割り当てられたメモリを追跡するには、malloc の内部データ構造と関係があります。
回答の概要:
はい、悪いことが起こる可能性があり、おそらく起こるでしょう。
これを防ぐには、次のようにします。
free(myString);
myString = NULL;
NULL
他の参照が作成された場合は、メモリへのすべての参照をに設定する必要があることに注意してください。
また、結果を指定して呼び出すfree()
と、NULL
アクションは発生しません。詳細については、以下を参照してください。
それほど賢くない。ダブルフリーの脆弱性については Google。NULL
このようなバグを回避するには、解放後にポインタを設定してください。
実行するシステムによっては、何も起こらないか、プログラムがクラッシュするか、メモリが破損するか、その他の興味深い効果がいくつもあります。
それは(潜在的に)あなたの鼻から悪魔を飛ばします.
ポインターを解放した後は、常に NULL に設定してください。null ポインターを解放しようとしても安全です。
これを自動的に行うには、独自の無料ラッパーを作成する価値があります。
バッドシングス(TM)
本当に、それは未定義だと思うので、NORADのメインフレームで「地球規模の熱核戦争」をプレイすることを含めて、まったく
そうしないでください。解放されたメモリが への呼び出しの間に別のものに再割り当てされるとfree
、事態は混乱します。
要するに、「未定義の動作」です。
(さて、それには何が含まれ、なぜそれが当てはまるのか、他の人がすでに述べています。この用語は非常に一般的であるため、ここで言及する価値がありました)。
プログラムがクラッシュしたり、メモリが破損したり、その他のより微妙な悪影響が生じる可能性があります。メモリを削除した後は、NULL (0) に設定することをお勧めします。null ポインターを解放しようとしても何も起こらず、安全であることが保証されています。同じことが c++ の削除にも当てはまります。
以下の確かに奇妙なマクロは、いくつかのクラスのセキュリティ脆弱性を一掃し、デバッグを支援するための便利なドロップイン代替品です.
#define my_free(x) do { free(x); x = NULL; } while (0)
do-while ループは、周囲のコードが複数ステートメントをより簡単に消化できるようにするためのものです。例えば if (done) my_free(x);
別の興味深い状況:
char * myString = malloc(sizeof(char)*STRING_BUFFER_SIZE);
char * yourString = myString;
if (myString)
{
free(myString);
myString = NULL;
}
// Now this one is safe, because we keep to the rule for
// setting pointers to NULL after deletion ...
if (myString)
{
free(myString);
myString = NULL;
}
// But what about this one:
if (yourString)
{
free(yourString);
yourString = NULL;
}
//?!? :)