2012-07-31 16 views

回答

2

沒有「老員工」。在這種情況下,一個

list<Employee>::operator = (const list<Employee> & source) 

將被調用。如果您沒有定義一個,那麼缺省值將會將作爲參數傳遞的實例的原始內容(員工)複製到字段(employees_)。

現在假設該列表包含一個指向動態分配內存的指針。在這種情況下,對該內存的引用將會丟失,並且會泄漏。

正確的溶液要麼檢查,如果操作者=正確超載(例如所有標準容器已經有了它實現),或通過實現它自己(僞代碼):

void list<Employee>::operator = (const list<Employee> & source) 
{ 
    freeContents(); 
    for (int i = 0; i < source.size(); i++) 
     add(source.getItem(i)); 
} 

編輯:

如果該列表實際上是一個std ::列表,它會正確處理分配,所以在這種情況下,答案是:有,列表本身將被自動釋放。它的內容,但是,這是另一回事。

+0

可以請你解釋一下 - 「所以如果你在列表類中動態地分配內存,它可能會泄漏。」 – 2012-07-31 11:58:03

+0

我編輯過帖子,現在更清楚了嗎? – Spook 2012-07-31 12:01:09

+0

我使用std :: list,所以我不會在列表中分配動態內存。 – 2012-07-31 12:04:08

0

不,你不會,它們會被自動銷燬。因爲它們存儲在自動存儲(棧)

也有點起色:

void update(const list<Employe> & employees){ //pass by reference, not by value 
    employees_ = employees; //old values are automatically destroyed and 
    // copies of new values are added, preserving the original values in passed container 
} 
+0

你是什麼意思自動存儲。我熟悉堆和堆棧? – 2012-07-31 11:50:57

+0

@ user1495181「stack」是許多用於表示「自動存儲」時使用的單詞 – juanchopanza 2012-07-31 11:52:12

+0

關於通過引用傳遞 - 它不是一個問題,因爲當調用方法結束時(創建列表和調用更新的方法)比在調用方法dosnt中建立的列表還多嗎? – 2012-07-31 11:52:27

1

在C++中,賦值運算符將LHS複製到RHS,並負責銷燬當前佔用LHS的任何東西。

在代碼

void update(list<Employe> employees){ 
    employees_ = employees; 
} 

功能已被執行之後,的employees_以前的內容將被銷燬,現在employees_將包含參數employees副本

爲了使這更有效,可以消除副本:

employees_ = std::move(employees); // C++11 

std::swap(employees_, employees);  // C++03 

在第一種情況下,employees_內容將被丟棄,而employees內容將將移至改爲employees_,留空employees

在第二種情況下,的employees_employees內容將是交換,這樣,當該函數返回的employees_原始內容將被丟棄。

0

在C++ 11,我會建議你使用std::move爲:

void update(list<Employee> employees) //NOTE : pass by value 
{ 
    employees_ = std::move(employees); 
} 

注意參數是按值傳遞,而不是按引用傳遞。這意味着,當你寫這篇文章,

update({e1,e2,e3,e3}); 

然後從參數創建的臨時名單移動的成員變量。通過這種方式,您可以避免創建臨時對象的副本(無論如何,這個副本都將被銷燬)。

如果您使用list<Employee> const & employees作爲參數,那麼您將無法通過上述調用創建的臨時對象的資源std::move

相關問題