Who*_*res 2 c++ memory-management delete-operator
我有一个函数,每次运行时都使用0.5 MB的内存.所以我决定一步一步地观察Windows任务管理器来逐步调查它.我注意到这些线后:
int **banned;
banned=new int*[vertices];
for(i=0;i<vertices;i++)
banned[i]=new int[k_colors];
Run Code Online (Sandbox Code Playgroud)
它使用0.5 MB内存.然后我决定return在行前删除它:
for(i=0;i<vertices;i++)
for(j=0;j<k_colors;j++)
delete []banned[j];
delete[]banned;
Run Code Online (Sandbox Code Playgroud)
使用函数的开头是8,5 MB内存.分配后,它变为9 MB,但在删除部分后,它仍然是9 MB.我在整个程序中执行此功能1000次.然后它被OS杀死了.知道为什么会这样,我该如何解决?
编辑:这里的main()部分:
int main()
{
srand(time(0));
input();
initialize();
for(int i = 0; i < MAX_GENERATION; i++)
{
parents = selection(TS);
population = cross_over(parents, PC);
mutation(PM);
elite=tabu_search(population);
elitism(); //270 MB memory using each time.
}
fclose(pFile);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
上面,elitism()函数的第一行是分配部分,最后一行是delete部分.
要delete[]正确使用,您应该删除与之相同的内容:
for(i=0;i<vertices;i++)
delete [] banned[i];
delete[] banned;
Run Code Online (Sandbox Code Playgroud)
您的"进程被杀"可能是因为您的原始代码导致了大量未定义的行为,多次删除相同的指针等等.
此版本可能会也可能不会向操作系统释放内存; 这是您的编译器/库和操作系统做出的决定.在某些系统上,内存似乎仍然可以分配给您的进程,但如果另一个进程需要,操作系统将能够声明它.
如果你反复调用同一个函数,它不应该累积内存; 以前的delete'd块可以接听new电话.