次のヘッダーを考えると:
#ifndef LIST_H
#define LIST_H
#include "ListEle.h"
class List{
private: ListEle* data;
const List* next;
public: List(ListEle* d, List* n):data(d),next(n){}
~List(){
if(data!=nullptr)delete data;
if(next!=nullptr)delete next;
}
};
#endif
私のリストが再帰的にそれ自体を削除するのは正しいですか?
次に、再帰的なデストラクタ (リスト用) を使用すると、最終的にスタックがスパムになることを示すいくつかのスレッドを読みました。だから私は代替案を検索し、次のような例を見つけました:
~List(){
delete data;
List* delptr = next;
while(delptr!=nullptr){
List* temp = delptr->next;
delete delptr;
delptr = temp;
}
}
私の考えが正しければ、「delete delptr」行のために、2番目の例も何らかの形で再帰的です。私の考えは、delete delptr が次のリスト項目のデストラクタを呼び出し、それが「delptr」も作成し、次の項目のデストラクタを呼び出し続けるというものです。そのため、スタックは最初の例と同じように見えるはずです。オブジェクトの削除に関する私の理解に誤りがある可能性があると確信しています。現時点では、2 番目の例の while ループは不要だと感じています。
誰かが私の状況を解決するのを手伝ってくれることを願っています。事前に感謝します。