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

C++ Memory Leak using list class and push_back

本文关键字:back c++ 内存 泄漏 push 列表      更新时间:2023-10-16

c++使用list类和push_back的内存泄漏

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

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

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

谢谢,谢谢你的回答!

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中的每个元素都是动态分配的,所以指针列表是冗余的,实际上是给您一组指向指针的指针。

您应该将list设置为unique_ptr s,以便在销毁时释放内存:

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

但是正如David Brown所说,你不应该用指针作为开头。