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

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

使用列表类和 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。但是为什么这个函数还是有内存泄漏呢?

谢谢, 非常感谢您的回答!

最佳答案

Employee 的析构函数被调用。您有一个指向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 中的每个元素都已动态分配,因此指针列表是多余的,本质上为您提供了一组指向指针的指针。

关于使用列表类和 push_back 的 C++ 内存泄漏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16205080/

相关文章:

python - 矢量模块中的点积

C++ - 如何创建一个 vector ,其中每个元素都是来自输入字符串的单个数字?

c++ - map 插入中的参数不匹配错误

javascript - JavaScript 中的内存管理技术

c++ - 如何安全地将 new 创建的对象传递给构造函数

linux - 什么是linux中的内存回收

c++ - Lambda捕获,初始化器和嵌套结构

c++ - 是否允许 null terminate() 处理程序?

iphone - OpenCV 人脸检测 - vector 问题