2016-09-21 11 views
0

リンクリストのノードを削除すると、nextをNULLに設定する必要がありますか? ListNodeは今、私がしたいこのデフォルトのデストラクタはメンバポインタが指すメモリを解放しますか?

struct ListNode { 
    int val; 
    ListNode* next; 
    ListNode(int x): val(x) {} 
} 

として定義されて

tmp->nextはデストラクタで削除される場合m

ListNode *tmp = m->next; 
m->next = m->next->next; 
delete tmp; 

後にノードを削除し、リンクリストがトラブルにする必要があります。

ListNode *tmp = new ListNode(0); 
tmp->next = new ListNode(1); 
delete tmp; 

tmp->nextが削除されていない場合は、再度、メモリのこの部分を見つける方法はありません。tmp->nextが削除されていない場合は、メモリリークが発生する別のケースがあるかもしれません。

ここではジレンマがありますが、デフォルトのデストラクタは実際に何をしていますか?

+0

メンバポインタの削除を呼び出さない –

+0

デフォルトのデストラクタは、そのメモリを解放するかどうかをどのように知ることができますか?そのメモリが動的に割り当てられているという保証はありません。 – AnT

答えて

1

デフォルトのデストラクタは、(デストラクタを持つ)すべてのメンバ変数を破棄し、それ以外は何もしません。

なしListNodeのメンバ変数にはデストラクタがあるため、ListNodeのデフォルトデストラクタは何もしません。

nextはメンバー変数ですが、nextは指し示すものではありません。

+0

それで 'tmp-> next'を削除するか、' tmp'を削除する前に別のポインタを与えるべきですか? –

+0

@KingstonChanあなたはすでにその質問に答えるために必要な情報を持っています。あなたはそれがそうだと思いますか? – immibis

+0

ありがとう!あなたは非常に便利です! –

0

ここではジレンマがありますが、デフォルトのデストラクタは実際に何をしていますか?

デフォルトのデストラクタは、メンバ変数を破棄します。メンバー変数にユーザー定義のデストラクタがある場合、それらは呼び出されます。基本型の場合は何も起こりません。

上記の内容よりも多くがあります。標準のデストラクタのセクションを読むのは貴重なことです。 C++ 11では、そのセクションは12.4です。詳細は、cppreference.comをご覧ください。

関連する問題