我有以下内容:
class Manager{
public:
void update(list<Employe> employees){
employees_ = employees;
}
private:
list<Employe> employees_;
};
我是否需要在更新方法结束时删除旧员工?
答案 0 :(得分: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,它将正确处理赋值,因此在这种情况下答案是:是的,列表本身将自动释放。然而,它的内容是另一个故事。
答案 1 :(得分: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_
,留下{{1}空的。
在第二种情况下,employees
和employees_
的内容将被交换,这样当函数返回employees
的原始内容时丢弃。
答案 2 :(得分: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
}
答案 3 :(得分: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
从上述调用创建的临时对象的资源。