我有以下内容:
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) 传递的实例的原始内容复制到字段 (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_
will 之前的内容已被销毁,employees_
现在将包含参数的副本employees
。
为了提高效率,您可以消除副本:
employees_ = std::move(employees); // C++11
或者
std::swap(employees_, employees); // C++03
在第一种情况下,employees_
将丢弃 的内容,并将 的内容employees
移动到,employees_
留空employees
。
在第二种情况下, 和 的内容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
as 参数,那么您将无法std::move
获取从上述调用创建的临时对象的资源。