Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/146.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/jsp/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ C++;使用list类和push_返回导致内存泄漏_C++_Memory Management_Vector_Memory Leaks_Destructor - Fatal编程技术网

C++ C++;使用list类和push_返回导致内存泄漏

C++ C++;使用list类和push_返回导致内存泄漏,c++,memory-management,vector,memory-leaks,destructor,C++,Memory Management,Vector,Memory Leaks,Destructor,使用list类和push_返回的C++内存泄漏 void EMAdd(int n) { list<Employee*> em; for (int i = 1; i <= n; i++) em.push_back(new Employee()); } void EMAdd(int n) { 列出em; 对于(int i=1;i不调用Employee的析构函数。您有一个list指向Employee对象的指针,而不是Employee对象的列表。当调用该列表的

使用list类和push_返回的C++内存泄漏

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

对于(int i=1;i不调用
Employee
的析构函数。您有一个
list
指向
Employee
对象的指针,而不是
Employee
对象的列表。当调用该列表的析构函数时,它将销毁指向
Employee
对象的指针,但不会销毁它们指向您创建的对象th
new Employee()
。它们仍将在内存中,但当列表被销毁时,对它们的唯一引用将丢失,从而泄漏内存

记住,每次调用
new
都必须在某个地方有一个匹配的调用
delete
。但是,最好不要使用指针,直接使用
员工
对象列表

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

对于(int i=1;i您应该有一个
列表
唯一的\u ptr
s,以便在销毁时释放内存:

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

但是正如David Brown所说,你不应该一开始就使用指针。

这是可行的,但是每个列表元素都已经独立地动态分配,所以一个
unique_ptr
的列表有点多余。@DavidBrown不介意我理解你的意思。他不应该一开始就使用指针。相关: