【问题标题】:C++ Memory Leak using list class and push_back使用列表类和 push_back 的 C++ 内存泄漏
【发布时间】:2013-04-18 18:38:36
【问题描述】:

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

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

第一季度。最后class list的析构函数会自动删除em的节点吗?

第二季度。但是为什么这个函数还有内存泄漏呢?

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

【问题讨论】:

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


【解决方案1】:

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

【讨论】:

    【解决方案2】:

    您应该拥有unique_ptrs 中的list,以便在销毁时释放内存:

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

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

    【讨论】:

    • 这行得通,但每个列表元素已经被独立动态分配,所以unique_ptr&lt;T&gt; 的列表有点多余。
    • @DavidBrown 没关系,我明白你的意思。他一开始就不应该有指针。
    猜你喜欢
    • 2013-03-01
    • 1970-01-01
    • 2011-05-15
    • 1970-01-01
    • 2020-09-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多