2013-03-01 41 views
3

我正在實現一個庫的自定義迭代器,並且正在重載運算符++和 - 。 我的前綴運算符完美地工作,但我的郵政運營商導致內存泄漏。導致內存泄漏的C++ post運算符(s)

avl_iterator& operator++() 
    { 
     _node = utilities::next_node(_node); 
     return (*this); 
    } 
avl_iterator& operator ++(int) { 
     avl_iterator temp(*this); 
     ++(*this); 
     return(temp); 
    } 

avl_iterator& operator --() { 
     _node = utilities::prev_node(_node); 
     return (*this); 
    } 

avl_iterator& operator -- (int) { 
     avl_iterator temp(*this); 
     --(*this); 
     return(temp); 
    } 

我知道這是因爲我返回一個臨時變量,但我似乎無法想象(或發現)這樣做的更好的方法。

+1

應該返回temp的副本,我猜 – billz 2013-03-01 00:59:14

+2

你正在返回一個超出範圍的東西的引用。這不會泄漏內存;它會導致未定義的行爲。 – chris 2013-03-01 00:59:51

+0

Eek!您正在返回對基於堆棧的變量的引用。不好。 – 2013-03-01 01:00:26

回答

4

返回一個臨時變量是非常好的:它將被複制回調用者,並且原始的變量將被釋放。只有當班級沒有正確管理資源時,它纔會成爲一個問題。

您的解決方案有問題的原因是因爲它返回副本,而是返回到一個局部變量temp,這是不確定的行爲的參考。

爲了解決這個問題,你應該改變你的後增/減運營商

avl_iterator operator -- (int) { 
    avl_iterator temp(*this); 
    --(*this); 
    return(temp); 
} 

avl_iterator operator ++(int) { 
    avl_iterator temp(*this); 
    ++(*this); 
    return(temp); 
} 

注意,無需複製是一個廣爲流傳的提醒到背後的一個主要原因更喜歡迭代器上的前增加/減少運算符到它們的後增加/減少對應物。

+1

你可以想象編譯器會警告這樣的事情。 *高聲*。 – 2013-03-01 01:02:13

+0

@NikBougalis,GCC用'-Wall'或者其他的東西來做。 – chris 2013-03-01 01:08:29

+1

這完美謝謝。還有@chris,它也是在-w4上做的,在我執行這些更改之前,我只是將其轉換爲-w4來檢查 – 2013-03-01 01:08:36