0

我有以下内容:

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

我需要在更新方法结束时删除旧员工吗?

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_will 之前的内容已被销毁,employees_现在将包含参数的副本employees

为了提高效率,您可以消除副本:

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

或者

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

在第一种情况下,employees_将丢弃 的内容,并将 的内容employees移动employees_留空employees

在第二种情况下, 和 的内容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 & employeesas 参数,那么您将无法std::move获取从上述调用创建的临时对象的资源。

于 2012-07-31T12:01:19.563 回答