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

0 c++ destructor memory-leaks memory-management vector

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

void EMAdd(int n)
{
   list<Employee*> em;
   for (int i = 1; i <= n; i++)
      em.push_back(new Employee());
}
Run Code Online (Sandbox Code Playgroud)

Q1.最后,类列表的析构函数会自动删除em的节点吗?

Q2.但为什么这个功能仍有内存泄漏?

谢谢,谢谢你的回答!

Dav*_*own 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());
}
Run Code Online (Sandbox Code Playgroud)

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