ポインターを削除すること、ポインターを null に設定すること、ポインターを解放することの違いは何ですか。
delete ptr;
対
ptr=NULL;
対
free(ptr);
ベストアンサー1
あなたの質問は、あなたがガベージコレクションのある言語から来ていることを示唆しています。C++ にはガベージコレクションがありません。
ポインタをNULLに設定しても、メモリは利用可能なメモリのプールに戻されません。他のポインタがこのメモリブロックを指していない場合、割り当てられているがアクセスできない「孤立した」メモリブロックが残るだけです。リークリークが蓄積して割り当てるメモリがなくなる場合にのみ、プログラムがクラッシュします。
逆の状況もあります。delete
ポインタを使用してメモリブロックを取得し、後でそのメモリがまだ割り当てられているかのようにアクセスしようとする場合です。これは、delete
ポインタを呼び出してもポインタがNULLに設定されないため可能です。ポインタは、以前に割り当てられたメモリのアドレスを指し続けます。割り当てられなくなったメモリへのポインタは、ぶら下がりポインタそして、その内容が予想と異なるため、そのメモリの一部が他の目的のために再割り当てされている可能性があり、それにアクセスすると通常、プログラムの動作がおかしくなり、クラッシュします。
[編集]stinky472 が述べているように、 と のもう 1 つの違いは、delete
前者free()
だけがオブジェクトのデストラクタを呼び出すことです。(delete
で割り当てられたオブジェクトに対して をnew
、free()
で割り当てられたメモリに対してを呼び出す必要があることに注意してくださいmalloc()
。これらを混在させることはできません。) C++ では、可能であれば常に静的割り当てを使用するのが最善ですが、そうでない場合は を使用してnew
くださいmalloc()
。