使用列表类和push_back的c++内存泄漏
C++ Memory Leak using list class and push_back
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所说,你不应该用指针作为开头。
相关文章:
- 推导 std::vector::back() 的返回类型
- vector.back() 和 vector[vector.size() - 1] 之间的区别?
- vector.push_back(vector.back()+1) 是未定义的行为吗?
- 线路抑制状态错误 C4703 可能未初始化的局部指针变量"back"已使用
- std::vector using back(), pop_back(), push_back(), 得到'double free or corruption'错误
- vector.back()和vector.end()有什么区别
- 列表大小为 1,但 front() 和 back() 不相等
- 返回C++中没有 back() 方法的容器的最后一个元素?
- 在非空 std::list 上使用 std::list.back<int>() 时"Segmentation Fault"
- 我们可以使用Back() - 值索引在其上执行向量插入
- 当我运行以下代码添加str.front() str.back时,它给了我200个,但为什么
- 链表回推操作中需要'back pointer'
- 为什么 std::string 的 back() 应该返回对字符的引用?
- VC++ 自动说明符假定矢量的引用限定符<bool>::back的引用限定符
- C: strtok value gives back null
- vector.back() 可以用来为向量的最后一个元素赋值吗?
- 在std::vector中实现back()
- 在push_front属性上有点混淆.intlist.push_front(2 * intlist.back())会做些
- 将对象转换为 char,然后"uncasting it back"
- std::vector back()的奇怪行为