2012-07-31 18 views

回答

2

没有“老员工”。在这种情况下,一个

list<Employee>::operator = (const list<Employee> & source) 

将被调用。如果您没有定义一个,那么缺省值将会将作为参数传递的实例的原始内容(员工)复制到字段(employees_)。

现在假设该列表包含一个指向动态分配内存的指针。在这种情况下,对该内存的引用将会丢失,并且会泄漏。

正确的溶液要么检查,如果操作者=正确超载(例如所有标准容器已经有了它实现),或通过实现它自己(伪代码):

void list<Employee>::operator = (const list<Employee> & source) 
{ 
    freeContents(); 
    for (int i = 0; i < source.size(); i++) 
     add(source.getItem(i)); 
} 

编辑:

如果该列表实际上是一个std ::列表,它会正确处理分配,所以在这种情况下,答案是:有,列表本身将被自动释放。它的内容,但是,这是另一回事。

+0

可以请你解释一下 - “所以如果你在列表类中动态地分配内存,它可能会泄漏。” – 2012-07-31 11:58:03

+0

我编辑过帖子,现在更清楚了吗? – Spook 2012-07-31 12:01:09

+0

我使用std :: list,所以我不会在列表中分配动态内存。 – 2012-07-31 12:04:08

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 
} 
+0

你是什么意思自动存储。我熟悉堆和堆栈? – 2012-07-31 11:50:57

+0

@ user1495181“stack”是许多用于表示“自动存储”时使用的单词 – juanchopanza 2012-07-31 11:52:12

+0

关于通过引用传递 - 它不是一个问题,因为当调用方法结束时(创建列表和调用更新的方法)比在调用方法dosnt中建立的列表还多吗? – 2012-07-31 11:52:27

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

在第二种情况下,的employees_employees内容将是交换,这样,当该函数返回的employees_原始内容将被丢弃。

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

相关问题