単純なデータ構造です。たとえば、 'next'ポインタがスマートポインタのリンクリストです。ヘッドノードが削除されると、「次へ」のスマートポインタがキックインし、再帰的な削除が実行されます。長いリストの場合、これはすぐにスタックを吹き飛ばします。スマートポインタは再帰的な削除のためにスタックを吹き飛ばします
私はこれらのスマートポインタを単純な生ポインタで置き換える必要がありました。私はここに何かを逃していますか
単純なデータ構造です。たとえば、 'next'ポインタがスマートポインタのリンクリストです。ヘッドノードが削除されると、「次へ」のスマートポインタがキックインし、再帰的な削除が実行されます。長いリストの場合、これはすぐにスタックを吹き飛ばします。スマートポインタは再帰的な削除のためにスタックを吹き飛ばします
私はこれらのスマートポインタを単純な生ポインタで置き換える必要がありました。私はここに何かを逃していますか
。あなたの「古い」頭部は削除され、古い第2位の項目は頭部に昇進します。すべてが一貫して変化し、深い再帰はありません。これに対する唯一の前提条件は、先頭がNULL
ではないということです。
Mikeは、リスト全体を削除することを目標にしている場合、ループ内で繰り返すことができるとコメントで指摘しています。
はい、あなたは 'while(head)head = head-> next;でリスト全体を非再帰的に削除することができます –
誰かがWTFに来るのでコメントすることを忘れないでください:) – UncleBens
"あなたの古い'頭は削除され、古い第2位のアイテムは頭に昇進します。」 - そのステートメントは、何が起こっているかを反映しながら、信じられないほど単純化されています。カジュアルな読者が言語力学とスマートポインタ機能の両方に精通していない限り、このソリューションは動作しますが、何よりも魔法です。彼らがよく知っているとすれば、最初はそれを必要としないだろう。単純な 'head = head-> next'の割り当ての間に何が起きているのかを段階的に見てみると、これは実質的に*明らかになります。 – WhozCraig
リンクリストクラスの内部にあるスマートポインタは、あなたを非常に購入していないようです。生のポインタは完全に私にとって妥当であるようです。私は、スマートポインタは、何かを削除することを忘れるのが簡単な、制御の難しい状況に最適であると思います。
スタックを爆破するには膨大なリストになっているはずです。コードにバグがないのは間違いありませんか?
head = head->next;
または同等:私はあなたが右理解してきたとの両方head
とnext
はあなたが行うことでこれを避けることができますスマートポインタであると仮定すると、
内部のスマートポインタがあなたを買うより高い例外安全の保証があるかもしれません。労働の面では無料で、保存コストは非常にわずかです。それだけで私にとって価値があるようです。 – Flexo
はい、それは公正な点です。 – john
まあ、新しく作成したノードを保持するためにスマートポインタを使用してから、リストに追加されます。しかし、いったんアタッチされると、それはリストノードのデストラクタの責任です。皆さんが指摘しているように、自動スマートポインタ再帰を手作業でコード化された繰り返しに置き換えるには、とにかにデストラクターで手動処理を行う必要があります。例外安全性の問題について詳しく教えてください。私は、デストラクタの処理されない例外は、スマートポインタに関係なく、とにかくプログラムを終了させると考えました。 – Jay
「吹き飛ばす」?どうぞよろしくお願いします。 – Flexo
これはスマートポインタの欠陥ではありません。私たちにいくつかのコードを見せてください。実装にバグがあります。いずれにせよ、完全なリストの削除は再帰ではなく反復によるものでなければならないので、一定のスタックスペースを取るべきです。 –
@Kerrek:おそらく、スマートポインタのデストラクタはpointeeを削除します。これは、pointeeが別のスマートポインタを含む場合に再帰を行います。私はそれを避けるためにスマートポインタを実装する方法を見ていません。 –