使用list class和push_back的C ++内存泄漏

时间:2013-04-25 01:45:39

标签: c++ memory-management vector memory-leaks destructor

使用list class和push_back

的C ++内存泄漏
void EMAdd(int n)
{
   list<Employee*> em;
   for (int i = 1; i <= n; i++)
      em.push_back(new Employee());
}

Q1。最后,类列表的析构函数会自动删除em?

的节点

Q2。但是为什么这个函数仍然有内存泄漏?

谢谢, 我很感激你的回答!

2 个答案:

答案 0 :(得分:6)

Employee的析构函数被调用。您有list指针Employee个对象,而不是Employee个对象的列表。当调用列表的析构函数时,它将销毁指向Employee对象的指针,但不会销毁它们指向您使用new Employee()创建的对象。它们仍然在内存中,但是当列表被破坏时,它们的唯一引用就会丢失,从而泄漏内存。

请记住,对new的每次通话都必须在某处与delete进行匹配。但是,最好不要使用指针,只需直接使用Employee对象列表。

void EMAdd(int n)
{
   list<Employee> em;
   for (int i = 1; i <= n; i++)
      em.push_back(Employee());
}

由于std::list中的每个元素都已动态分配,因此指针列表是多余的,本质上为您提供了一组指针指针。

答案 1 :(得分:2)

你应该list unique_ptr个,以便在销毁时释放内存:

std::list<std::unique_ptr<Employee>> em;

但正如大卫布朗所说,你不应该使用指针开始。