使用列表类和 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。但是为什么这个函数还有内存泄漏呢?
谢谢,我会很感激你的回答!
使用列表类和 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。但是为什么这个函数还有内存泄漏呢?
谢谢,我会很感激你的回答!
的析构函数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
都已动态分配,因此指针列表是多余的,并且本质上为您提供了一组指向指针的指针。
您应该有 a list
of unique_ptr
s 以便在销毁时释放内存:
std::list<std::unique_ptr<Employee>> em;
但正如大卫布朗所说,你不应该一开始就使用指针。