私はMyClassのへのポインタを持っていると仮定します。ポインタを削除してポインタをNULLに設定する違いは何ですか?
MyClass *myPointer = new MyClass();
delete myPointer;
とmyPointer = NULL;
の違いは何ですか?
おかげ
私はMyClassのへのポインタを持っていると仮定します。ポインタを削除してポインタをNULLに設定する違いは何ですか?
MyClass *myPointer = new MyClass();
delete myPointer;
とmyPointer = NULL;
の違いは何ですか?
おかげ
delete myPointer
は、メモリの割り当てを解除、それはいくつかのガベージアドレスを指していることを、myPointer
変数の値を残します。
myPointer = NULL
だけで、あなたがそれらの文字列の両方を使用する必要があります理想的な世界でmyPointer
と同じアドレスを指す他のポインタを、削除しない場合は、おそらくのように、メモリリーク、ヌル・ポインタにmyPointerの値を設定しますこの:
delete myPointer; // free memory
myPointer = nullptr; // setting value to zero, signalizing, that this is empty pointer
しかし、全体として、メモリ管理に現代的なアプローチである、std::unique_ptr
を使用しています。
delete myPointer
は割り当てられたスペースを解放しますが、(割り当てられていないものを指し示す)ダングリング・ポインターを使用できます。
myPointer = NULL
あなたは将来の問題を防ぐために、次のイディオムを使用することがあります。
簡単に言えばdelete myPointer;
myPointer = NULL;
ケルビンで使用するイディオムは、スマートポインタです。 – rubenvb
私は言ったかもしれません...しかし私は持ってはいけない、あなたの提案はもちろん良いです。 –
、削除は、以前新しいキーワードで割り当てられたオブジェクトのメモリを解放するために使用されます。オブジェクトのデストラクタは、オブジェクトのメモリが解放される前に呼び出されます(オブジェクトにデストラクタがある場合)。割り当て解除メモリ逆参照(通常は)削除呼び出した後にNULL値を持っていないが、それらのいずれかの操作がエラーを引き起こすこと
ポインタ。
NULLへのポインタの設定は、何も逆参照しないことを意味しますが、オブジェクトに割り当てられたメモリは引き続き維持されます。それは彼らがまだ有効(一貫性のあるメモリ領域間接参照)かそうでないかどうかを確認することができますように
は時々、彼らは間接参照オブジェクトを削除した後、NULLへのポインタを設定するのに有用である可能性があります。
割り当てられたメモリを解放/削除しないメモリリーク – UnholySheep