我有以下幾點:當我替換它們時,是否需要刪除在班級成員中設置的對象?
class Manager{
public:
void update(list<Employe> employees){
employees_ = employees;
}
private:
list<Employe> employees_;
};
我是否需要更新方法的末尾刪除老員工?
我有以下幾點:當我替換它們時,是否需要刪除在班級成員中設置的對象?
class Manager{
public:
void update(list<Employe> employees){
employees_ = employees;
}
private:
list<Employe> employees_;
};
我是否需要更新方法的末尾刪除老員工?
沒有「老員工」。在這種情況下,一個
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 ::列表,它會正確處理分配,所以在這種情況下,答案是:有,列表本身將被自動釋放。它的內容,但是,這是另一回事。
可以請你解釋一下 - 「所以如果你在列表類中動態地分配內存,它可能會泄漏。」 – 2012-07-31 11:58:03
我編輯過帖子,現在更清楚了嗎? – Spook 2012-07-31 12:01:09
我使用std :: list,所以我不會在列表中分配動態內存。 – 2012-07-31 12:04:08
不,你不會,它們會被自動銷燬。因爲它們存儲在自動存儲(棧)
也有點起色:
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
}
你是什麼意思自動存儲。我熟悉堆和堆棧? – 2012-07-31 11:50:57
@ user1495181「stack」是許多用於表示「自動存儲」時使用的單詞 – juanchopanza 2012-07-31 11:52:12
關於通過引用傳遞 - 它不是一個問題,因爲當調用方法結束時(創建列表和調用更新的方法)比在調用方法dosnt中建立的列表還多嗎? – 2012-07-31 11:52:27
在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_
原始內容將被丟棄。
在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
。
它應該說'僱員'而不是'僱主'。 – 2012-07-31 11:49:43