使用list class和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。但是为什么这个函数仍然有内存泄漏?
谢谢, 我很感激你的回答!
答案 0 :(得分: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());
}
由于std::list
中的每个元素都已动态分配,因此指针列表是多余的,本质上为您提供了一组指针指针。
答案 1 :(得分:2)
你应该list
unique_ptr
个,以便在销毁时释放内存:
std::list<std::unique_ptr<Employee>> em;
但正如大卫布朗所说,你不应该使用指针开始。