2017-04-23 10 views
2

C++で単一リンクリスト用のテンプレートをプログラミングしていますが、最初のノードの情報を削除するときに正しい情報を返す方法が混乱しています。これはリンクリストを使用してメモリリークを引き起こしますか?

ヘッドノードの値を返すメソッドとそれを削除するメソッドの2つのメソッドが書かれています。そのメソッドfront()とpop()を呼び出して、front()は "const T &"型の値を返します。

T object = list.front(); 
list.pop(); 

それが何を指しているオブジェクト参照をもたらさないであろう:私の質問の一つは、私はこのような何かを行う場合は、ありますか? pop()を呼び出した後にそのオブジェクトを使用し続けると問題はありますか?

2番目の質問は、フロント()メソッドを使用しての正しい方法は何だ、であるとの違いは何です:T object = list.front();については

T object = list.front(); 
// or 
T& object = list.front(); 
// or 
const T& object = list.front(); 
+2

'object'はオブジェクトであり、オブジェクトへの参照ではありません。それは指していない。 – melpomene

答えて

3

あなたは

T object = list.front(); 

front()戻りT&を行う場合は、objectは、リストの最初の要素ではなく、それへの参照のコピーになります。

、他の一方で、あなたは

const T& ref = list.front(); 

を書く場合は、list.pop()への呼び出しは、メモリリークが異なるrefダングリング参照を、になるだろう。

これは、第1の例と第3の例の違いを説明します。 2番目の例の非const基準const基準から構成することができないので、即ち

T& object = list.front(); 

は、コンパイルされないであろう。

2

は、objectlist.front()のコピーで、その後には何の関係もありません元の要素。だから、list.pop()はそれに全く影響を与えません。

T& object = list.front();については、これを行うことはできません。 const T&を暗黙的にT&に変換することはできません。

const T& object = list.front();の場合、オブジェクトはlistの要素への参照です。だからlist.pop()の後にぶら下がります。

関連する問題