私はポインタと削除ポインタがC++でどのように働いたのか不思議に思ったので、私は実験を設定しました。私はこれが正常にリスト内のすべてのノードを削除したとリンクリスト内のすべてのノードを「完全に」削除するにはどうすればよいですか?
void deleteList(Node *node) {
if (!node)
return;
deleteList(node->next);
cout << "deleting node " << node->data << endl;
delete node;
node = nullptr;
}
:私は非常に単純な、単一リンクのリストがあり、リスト内のすべてのノードを削除し、次の再帰関数を作りました。
List list;
// appending a bunch of numbers to the list...
list.deleteList(list.head);
if (list.head)
cout << true;
これはヘッドが実際にまだ存在しないことを意味し、コンソールに1を出力します。ただし、メインでこの関数を呼び出した後、私は、ヘッドノードがまだ存在するかどうかを確認します。私は頭とそれの後のすべての他のノードがnullになることを期待しています。したがって、if条件が失敗するのは、ポインタをnullに設定することが再帰関数で最後に行うことです。だから、なぜ頭がまだ存在していると報告しているのですか?
編集:変更されたリストlist();リストへ
'リストリスト();'はあなたの考えではありません。 [Most Vexing Parse](https://en.wikipedia.org/wiki/Most_vexing_parse) – Mahesh
はい、私は実際に私の実験で2つのコンストラクタを持っています。上記の私の例では、サイズのために0や新しい空のヘッドノードのような値を初期化する他のコンストラクタを呼び出します。 – Manuel
ステートメントはコンストラクタをまったく呼び出さない。戻り値の型が 'List'の関数' list'の宣言です。オブジェクトの初期化のために、 '()'を削除する必要があります。 – Mahesh