0

私は次のものを持っています:

class Manager{
public:
    void update(list<Employe> employees){
        employees_ = employees;
    }
private:
    list<Employe> employees_;
};

updateメソッドの最後に古い従業員を削除する必要がありますか?

4

4 に答える 4

2

「老人」はいません。この場合、

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である場合、割り当ては正しく処理されるため、この場合の答えは次のとおりです。はい、リスト自体は自動的に解放されます。その内容は、しかし、それは別の話です。

于 2012-07-31T11:55:22.097 に答える
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

2番目のケースでは、との内容employees_交換employeesされるため、関数が戻るときにの元の内容は破棄されます。employees_

于 2012-07-31T11:55:32.967 に答える
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
}
于 2012-07-31T11:46:34.653 に答える
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

于 2012-07-31T12:01:19.563 に答える