2017-09-07 11 views
1

に私がリンクリストを実装しただけで頭=頭部>次の(代わりに頭の= old->次)をしない理由を私は、思っていました前のアドレスを指しているものがない場合(ヘッドノードのヘッドが現在次のノードを指しているため)、メモリリークがどのように発生しますか?ポインタは、連結リストの例

ありがとうございました。

+0

これらの3行は残っているが、2行目の行が古い行に変更されている場合、コードは同じになり、メモリリークは発生しません。 –

答えて

4

C++には、参照されなくなったストレージを解放する他の言語のような自動ガベージコレクションはありません。これにはいくつかの理由があり、そのトピックに関する議論はWhy doesn't C++ have a garbage collector?にあります。

これは、newであることがdeletedであること、または漏れがあることを意味します。

は、ノード1のアドレスはもはや作り、知られている

enter image description here

、あなたが headを上書きする前に headのない delete元の値を行う場合は、

enter image description here

を持っていると言うんそれはdeleteするために割り当てを追跡することは不可能に隣接しています。これは漏れを強制する。

しかし、あなたは次のノードを見つけることができませんhead->next、あなたが全体のリストを失い、リークし、再指し、それ以前にあなたdelete head場合

enter image description here

しかし、あなたは、このケースで

enter image description here

oldheadのアドレスの一時的なコピーを作成する場合は、次のことができ、安全に再ポイントhead

enter image description here

、まだ割り当てのアドレスがdeleteになる必要があります。oldに格納されています。

+0

私が見ていたコードは、これはエラーですが、 'new'で頭を作成していませんでしたか? – coder666

+0

@ coder666あなたは本当に 'head'を削除していません。 'head'が指しているものを削除しています。 'head'は任意の' Node'を指すことができ、 'head'が' new'によって作成された 'Node'を指している場合、誰かが遅くまたは遅く' delete'する必要があります。キーワード: "Ownership semantics"。この場合、リンクされたリストは 'Node'の所有者であり、' head'はリンクされたリストが 'Node'への参照を格納する場所です。 'head'自体は、範囲外になったときに自動的に処理される自動変数です。 – user4581301

+0

私はそれを手に入れます!ありがとうございました ! – coder666

関連する問題