私は次のものを持っています:
class Manager{
public:
void update(list<Employe> employees){
employees_ = employees;
}
private:
list<Employe> employees_;
};
updateメソッドの最後に古い従業員を削除する必要がありますか?
私は次のものを持っています:
class Manager{
public:
void update(list<Employe> employees){
employees_ = employees;
}
private:
list<Employe> employees_;
};
updateメソッドの最後に古い従業員を削除する必要がありますか?
「老人」はいません。この場合、
list<Employee>::operator = (const list<Employee> & source)
と呼ばれます。定義しなかった場合、デフォルトでは、パラメーター(employees)として渡されたインスタンスの生のコンテンツがフィールド(employees_)にコピーされます。
ここで、そのリストに動的に割り当てられたメモリへのポインタが含まれているとします。このような場合、そのメモリへの参照が失われ、リークが発生します。
正しい解決策は、operator =が正しくオーバーロードされているかどうかを確認するか(たとえば、すべての標準コンテナーにすでに実装されているか)、自分で実装する(擬似コード)ことです。
void list<Employee>::operator = (const list<Employee> & source)
{
freeContents();
for (int i = 0; i < source.size(); i++)
add(source.getItem(i));
}
編集:
リストが実際にstd::listである場合、割り当ては正しく処理されるため、この場合の答えは次のとおりです。はい、リスト自体は自動的に解放されます。その内容は、しかし、それは別の話です。
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
2番目のケースでは、との内容employees_
が交換employees
されるため、関数が戻るときにの元の内容は破棄されます。employees_
いいえ、しません。自動的に破棄されます。自動ストレージ(スタック)に保存されているため
また、少し改善:
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
}
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