私はNode
オブジェクトの外に構築されたリンクリストを持っている:リンクされたリストを再帰的に削除すると、スタックのオーバーフローが発生しますか?
class Node {
public:
Node(string data);
Node* GetNext() const;
void SetNext(Node* nextNode);
~Node();
private:
string data;
Node* next;
};
デストラクタは以下に定義される:デストラクタが頭Node
に呼び出されなければなりません
Node::~Node() {
delete next;
}
。
私の質問は次のとおりです。このような単一リンクリストを削除すると、大きなリストでスタックオーバーフローが発生します(小数点以下は、<サイズリストで問題ありません)。もしそうであれば、
Node
には定義されたコンストラクタはありません
while (head->GetNext() != 0) {
Node* temp = head->GetNext();
head->SetNext(temp->GetNext());
delete temp;
}
delete head;
のような反復解法を使用する方がよいでしょうか?
リンクリストのこれらの奇妙な実装は得られません。ノードがチェーン内の他のノードを破壊しています。 1つのノードをリストから削除したい場合、どうすればよいですか?より良いオプションは、メンバーがノード・ポインターであるリンク・リスト・クラスを作成することです。リンク・リスト・クラスは、ノードが適切であると見なして削除して割り当てます。 Nodeクラスには、ユーザー定義のデストラクタは一切ありません。 – PaulMcKenzie
スタックオーバーフローを*簡単に*引き起こすことができます。あなたのリンクされたリストに百万のノードを投げて試してみてください。 – WhozCraig
"このような単一リンクリストを削除すると、大きなリストにスタックオーバーフローが発生します。"間違いなく、あなた自身でこれをテストするのは非常に簡単です。 – yms