当我替换它时,我是否需要删除我在类成员中设置的对象?

时间:2012-07-31 11:43:53

标签: c++

我有以下内容:

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

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

4 个答案:

答案 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}空的。

在第二种情况下,employeesemployees_的内容将被交换,这样当函数返回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从上述调用创建的临时对象的资源。