2017-04-23 88 views
2

我正在爲C++中的單鏈表編寫一個模板,我對於在刪除第一個節點時返回第一個節點的信息的正確方法感到困惑。這會導致使用鏈接列表的內存泄漏?

我從書中獲得了一些幫助,其中有兩種方法,一種是返回頭節點的值,另一種是刪除它的方法。讓我們調用front()和pop()方法,其中front()以「const T &」類型返回值。我的一個問題是,如果我這樣做:

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

這不會導致對象引用指向什麼都沒有?調用pop()後繼續使用該對象是否有任何問題?

第二個問題是,什麼是使用前()方法的正確方法,什麼是之間的區別:

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懸空的參考,這是內存泄漏不同。

這應該解釋你的第一個和第三個例子的區別;第二個例子,即

T& object = list.front(); 

不會編譯,因爲非const參考不能從const參考來構造。

2

T object = list.front();objectlist.front()副本,然後無關與原始元素。所以list.pop()根本沒有任何影響。

對於T& object = list.front();,你不能那樣做。 const T&不能隱式轉換爲T&

對於const T& object = list.front();,對象是對list中元素的引用。所以在list.pop()之後它就會懸空。