35

例えば:

char * myString = malloc(sizeof(char)*STRING_BUFFER_SIZE);
free(myString);
free(myString);

これを行うことによる悪影響はありますか?

4

14 に答える 14

41

章と節はこちら。

[関数への] 引数が、 、、または 関数freeによって以前に返されたポインターと一致しない場合、またはの呼び出しによってスペースが割り当て解除された場合、動作は未定義です。( ISO 9899:1999 -プログラミング言語 — C、セクション 7.20.3.2)callocmallocreallocfreerealloc

于 2008-09-26T04:59:28.553 に答える
19

何もない、サイレントメモリ破損、またはセグメンテーション違反のいずれかです。

于 2008-09-25T19:33:58.053 に答える
14

はい、プログラムをクラッシュさせるダブルフリーエラーが発生する可能性があります。割り当てられたメモリを追跡するには、malloc の内部データ構造と関係があります。

于 2008-09-25T19:33:17.947 に答える
9

回答の概要:

はい、悪いことが起こる可能性があり、おそらく起こるでしょう。

これを防ぐには、次のようにします。

free(myString);
myString = NULL;

NULL他の参照が作成された場合は、メモリへのすべての参照をに設定する必要があることに注意してください。

また、結果を指定して呼び出すfree()と、NULLアクションは発生しません。詳細については、以下を参照してください

于 2008-09-25T19:44:49.107 に答える
6

それほど賢くない。ダブルフリーの脆弱性については Google。NULLこのようなバグを回避するには、解放後にポインタを設定してください。

于 2008-09-25T19:34:29.253 に答える
5

実行するシステムによっては、何も起こらないか、プログラムがクラッシュするか、メモリが破損するか、その他の興味深い効果がいくつもあります。

于 2008-09-25T19:33:45.793 に答える
5

それは(潜在的に)あなたの鼻から悪魔を飛ばします.

于 2011-08-28T19:35:22.960 に答える
3

ポインターを解放した後は、常に NULL に設定してください。null ポインターを解放しようとしても安全です。

これを自動的に行うには、独自の無料ラッパーを作成する価値があります。

于 2008-09-25T19:36:20.983 に答える
3

バッドシングス(TM)

本当に、それは未定義だと思うので、NORADのメインフレームで「地球規模の熱核戦争」をプレイすることを含めて、まったく

于 2008-09-25T19:38:56.873 に答える
2

そうしないでください。解放されたメモリが への呼び出しの間に別のものに再割り当てされるとfree、事態は混乱します。

于 2008-09-25T19:33:57.273 に答える
1

要するに、「未定義の動作」です。

(さて、それには何が含まれ、なぜそれが当てはまるのか、他の人がすでに述べています。この用語は非常に一般的であるため、ここで言及する価値がありました)。

于 2008-09-26T04:43:55.207 に答える
1

プログラムがクラッシュしたり、メモリが破損したり、その他のより微妙な悪影響が生じる可能性があります。メモリを削除した後は、NULL (0) に設定することをお勧めします。null ポインターを解放しようとしても何も起こらず、安全であることが保証されています。同じことが c++ の削除にも当てはまります。

于 2008-09-25T19:42:39.627 に答える
1

以下の確かに奇妙なマクロは、いくつかのクラスのセキュリティ脆弱性を一掃し、デバッグを支援するための便利なドロップイン代替品です.

#define my_free(x) do { free(x); x = NULL; } while (0)

do-while ループは、周囲のコードが複数ステートメントをより簡単に消化できるようにするためのものです。例えば ​​if (done) my_free(x);

于 2008-09-28T03:35:52.237 に答える
-1

別の興味深い状況:

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;
}

//?!? :)
于 2010-08-26T13:07:46.097 に答える