2016-10-28 1 views
0

私はいくつかの乱雑なコードからすべてのメモリリークを排除しようとしています。私はクラスEmployeeとメンバーname_を持っており、実行時にヒープ上にnew *charで割り当てられます。今すぐEmployeeのデストラクタが呼び出される前にname_が手動で削除される場合があります。これが悪い習慣であることは分かっていますしかし、デストラクタを使って削除するには、まだname_が必要な場合があります。私は無料のものがあるかどうかによってメモリを解放できますか?

Employee::~Employee(){ 
    if (this->name_) 
    { 
    delete[] this->name_; 
    } 
} 

または

if (this->name_ != NULL) 
{ 
    delete[] this->name_; 
} 

または

if (this->name_[0] != '\0') 
{ 
    delete[] this->name_; 
} 

のようなものを試してみました。しかし、これらのオプションはname_はすでにどこか別の場所deltedとしませんでした何かを削除することが試みられていることに気づきませんでしたもう存在しない。

だから私は、メンバーがすでに削除されているif天気をwithingチェックする方法はあり

if (char* name_ not deleted yet) 
{ 
    delte name_ 
} 

ようなものが必要でしょうか?

編集: すでに私の答えた質問へのリンクありがとうございました。

+2

'std :: string'を使って、標準ライブラリの実装があなたのためのメモリ管理を処理できるようにします。 – NathanOliver

+0

@ NathanOliverこれは割り当てのためであり、変更が許可されていないものがいくつかあります。たとえば、 'name_'の型が' char * 'です。 –

答えて

1

手動name_のためのメモリを管理する(代わりのstd::stringを使用して)を主張した場合、あなたは、単にあなたのクラスとdeleteにそれをカプセル化することができ、それを手動で削除した後nullptrname_を設定し、いくつかのreset()機能を経由して。あなたのデストラクタでは、name_nullptrでなく、deleteでないかどうかをチェックするだけです。

+1

ヌルポインタに対して 'delete'を呼び出すことは安全です。したがって、' delete'を呼び出す前にnullをチェックする必要はありません。 –

+0

@RemyLebeauはい、すばらしいこと!なぜ私はそれを再確認することを決めたのか分からない。編集ありがとう! –

関連する問題