2016-10-24 15 views
0

私はポインタであるクラスにデータメンバーを持っています。また、私はダイナミック配列の目的のために、このポインタを動的に割り当てるためのsetter関数を持っています。新しい値を設定する前に、メモリリークを避けるためにこのポインタを削除する必要があります。どのように初期化されていない場合、私は新しい値を設定する前に、ポインタのメモリを削除する必要はありませんように、このポインタが初期化されているかどうかを確認するのだろうか。C++のクラスのデータメンバーとしてのポインタが初期化されているかどうかを確認するにはどうすればよいですか?

+3

が使用されていないときに 'nullptr'に設定されているか、まともなことをして、' unique_ptr'を使ってあなたのライフタイムを処理してください。ちなみに、 'nullptr'で' delete'を呼び出すと、何もしません。 – jaggedSpire

+0

メンバのデフォルト値を 'nullptr'として設定することを意味しますか?これがC++でどのように行われているのだろうか?@ jaggedSpire – Nicholas

+1

クラスメンバ初期化、メンバ初期化子リスト、またはコンストラクタ本体で 'nullptr'に設定してください – jaggedSpire

答えて

4

2つのオプションがあります。まず、すべてを手作業で行い、コンストラクタのnullptrに設定します。新しいメモリを割り当てる前に、それがnullptrかどうかをチェックし、そうでない場合は削除してください。代わりにstd::unique_ptrのようなスマートポインタを使用することをお勧めします。あなたはそれを新しいポインタに設定する必要があるたびにresetを呼び出すことができ、メモリリークについて心配する必要はありません。以前に割り当てられたメモリがあれば削除します。

+0

最初のシナリオでは、削除する前にNULLを確認する必要はありません。 'delete'はヌルポインタを正しく扱います。 –

+0

@PeteBecker 1.まだ 'nullptr'に設定する必要がありますが、' delete'の前にその無効性を確認する必要はありません。 2.私のポインタは将来動的配列になるかもしれませんし、 'delete [] a_pointer;'は 'nullptr'でも正しく動作しますか? – Nicholas

+0

@grigor 'std :: unique_ptr'は素晴らしく聞こえますが、このマジック' std :: unique_ptr'を使うためのパフォーマンスのコスト(速度の低下を意味します)があるのだろうか? – Nicholas

関連する問題