2011-02-01 13 views
2

可能性の重複:
Should one really set pointers to NULL after freeing them?free()でメモリを解放した後にポインタを無効にするのはなぜですか?

私はmallocとのcallocを使用してポインタに動的メモリを割り当てられています。このポインタを使用した後、ブロックをOSに戻すことができるようにメモリを解放する必要があります。ヘルプ...

+4

可能重複べきものの後NULL' '本当にセットのポインタそれらを解放する?](http://stackoverflow.com/questions/1879550/should-one-really-set-pointers-to-null-after-freeing-them)。また、参照してください:[変数をNULLの空きの後に設定する](http://stackoverflow.com/questions/1025589/setting-variable-to-null-after-free)と[それは常にNULLにポインタを設定するのは良い習慣無料() - それらをする?](http://stackoverflow.com/questions/3365772/is-it-always-a-good-practice-to-set-pointers-to-null-after-free-ing-them )などが挙げられる。 –

+0

すばらしいリンク.....ありがとう......... – Muse

答えて

8

ダングリングポインタが残ることはありません。未使用のポインタをヌルにすることなく、後でポインタを安全に参照解除または解放できるかどうかを検出する方法がありません。 参照を取り消そうとすると、またはダングリングポインタが解放されると、定義されていない動作が発生します(=クラッシュ)。

+1

あなたが運が良ければ、クラッシュします。最悪の部分は通常プログラムが生き残ることですが、コード内でバグを見つけるのは非常に困難です。 – ruslik

+1

@ruslik、確かに。それにもかかわらず、最終的には(ほとんどの場合)クラッシュするでしょう。私はちょうどOPのための簡単な説明を与えたいと思った:-) –

3

ため

pointer = NULL; 

おかげであなたは再びfree()にそれを試すため、場合Undefined Behaviourが発生します。今、私の質問は、ブロックを解放した後、なぜ私はそのような何かをしなければならないことです。

また、freeの後に、メモリはプログラムによって再利用されます。 OSではありません。メモリは、プログラムの実行が終了した後、OSによって再要求されます。

2

ポインタ変数が有効範​​囲内に残っていると、有効なアドレスが格納されているかどうかを後で判断できず、そのポインタを使用しようとすると未定義の動作になります。

free()の後にヌルへのポインタを設定することが保護手段です。

if(...) { 
    void* ptr; 
    ptr = malloc(...); 
    //use the buffer; 
    free(ptr); 
    ptr = 0; //not actually needed 
} 

が、同時にほとんどのコンパイラは、このような場合にはnullにポインタを設定することが観察可能な効果を持っていないことを確認できます:あなたはポインタがすぐ free()後にスコープから抜け出すことがわかっている場合は、これを必要としませんそのコードを最適化してください。

0

まず、コードを簡単にします。メモリを管理すると、多くの時間がmallocfreeになります。 NULLに設定すると、次のようなことができます:

int *pMyInteger; 

/* in init code */ 

pMyInteger = (int *) malloc(42); 

/* use pMyInteger */ 

free(pMyInteger); 
pMyInteger = NULL; 

/* somewhere else you have to change the size */ 

free(pMyInteger); 
pMyInteger = (int *) malloc(42 * 10000); 

本当に簡単ですね。

第2に、デバッガでは、ダングリングされたポインタよりもNULL(0)ポインタを見つけるのが簡単です。それは簡単にあなたが0xbac765を参照してくださいdebugger.Whenで0x0を見たとき、ポインタ管理に問題があることを推測するために、それは難しいです:)

MY2C

[の
関連する問題