0

使用列表类和 push_back 的 C++ 内存泄漏

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

Q1。最后,类list的析构函数自动删除em的节点?

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

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

4

2 回答 2

6

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

请记住,每个呼叫都new必须有一个匹配的呼叫到delete某个地方。但是,最好不要使用指针,直接使用Employee对象列表。

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

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

于 2013-04-25T01:49:07.987 回答
2

您应该有 a listof unique_ptrs 以便在销毁时释放内存:

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

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

于 2013-04-25T01:51:28.063 回答