我有以下几点:当我替换它们时,是否需要删除在班级成员中设置的对象?
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_)。
现在假设该列表包含一个指向动态分配内存的指针。在这种情况下,对该内存的引用将会丢失,并且会泄漏。
正确的溶液要么检查,如果操作者=正确超载(例如所有标准容器已经有了它实现),或通过实现它自己(伪代码):
void list<Employee>::operator = (const list<Employee> & source)
{
freeContents();
for (int i = 0; i < source.size(); i++)
add(source.getItem(i));
}
编辑:
如果该列表实际上是一个std ::列表,它会正确处理分配,所以在这种情况下,答案是:有,列表本身将被自动释放。它的内容,但是,这是另一回事。
可以请你解释一下 - “所以如果你在列表类中动态地分配内存,它可能会泄漏。” – 2012-07-31 11:58:03
我编辑过帖子,现在更清楚了吗? – Spook 2012-07-31 12:01:09
我使用std :: list,所以我不会在列表中分配动态内存。 – 2012-07-31 12:04:08
不,你不会,它们会被自动销毁。因为它们存储在自动存储(栈)
也有点起色:
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-31 11:50:57
@ user1495181“stack”是许多用于表示“自动存储”时使用的单词 – juanchopanza 2012-07-31 11:52:12
关于通过引用传递 - 它不是一个问题,因为当调用方法结束时(创建列表和调用更新的方法)比在调用方法dosnt中建立的列表还多吗? – 2012-07-31 11:52:27
在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_
原始内容将被丢弃。
在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
。
它应该说'雇员'而不是'雇主'。 – 2012-07-31 11:49:43