2012-02-28 7 views
1

リンクリスト関数をすべて再実装する必要がある課題に取り組んでいます。私は、デコンストラクタが何をするのか、それともコードが何であるかを理解するのに苦労しています。私はリストを解体するコードを書いたが、それが正しいとは思わない(下記参照)。私はLinkedList関数の多くでデコンストラクタを呼び出す必要があるという印象を受けています。誰かが私にこのことを説明し、デコンストラクタコードの外観を教えてください。リンクリストを分解する

~list() 
{ 
    for(int i=0; i<length; i++) 
    { 
     pop_front(); 
    } 
    delete head; 
} 
+1

あなたは 'list'class.Alsoの定義を表示する必要がある、正しい用語は*ですデストラクタ*デコンスター*ではありません。 –

答えて

2

コードが表示されていない限り、正確な解決策を提案することはできません。手書きリンクリストを使用している場合は、動的に割り当てられたリンクリストノードの割り当てをすべて解除する必要があります。 std::listを使用することもできます。

デストラクタ」は、明示的に呼び出されるべきではありませんが、delete呼び出しの一部として呼び出されます。リンクリストを終了0を破壊する1つの方法は、(例えば、擬似コード)のようになります。その後、

class node { 
    int data; 
    node *next; 
public: 
    ~node() 
    { 
    delete this->next; // this will be chained until NULL is found 
    } 
}; 

class list { 
    node *head; 
    ... 
public: 
    ~list() 
    { 
    delete head; 
    } 
}; 

、コール、

1

すべてのリストノードのうちdeleteを実行していないため、メモリリークが発生しています。典型的な実装では、このようなことができます。また

For each node in the list 
    delete node; 

Clear the entire list; 

私はLinkedListの機能の多くにデコンストラクタ を呼び出す必要がある印象でも午前

ありませんあなたの関数からデストラクタを明示的に呼び出すべきではありません。オブジェクトが有効範囲外になるか、誰かがあなたのリストのdeleteを実行したときに自動的に呼び出されます。これは完全にあなたのlistクラスを使用しているコードに依存します。ただし、eraseなどの関数では、リストから1つのノードを削除することもできますが、リストのデストラクタを呼び出す必要はありません。

関連する問題