delete []真的可以在C++中运行吗?

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部分.

M.M*_*M.M 6

delete[]正确使用,您应该删除与之相同的内容:

for(i=0;i<vertices;i++)
    delete [] banned[i];

delete[] banned;
Run Code Online (Sandbox Code Playgroud)

您的"进程被杀"可能是因为您的原始代码导致了大量未定义的行为,多次删除相同的指针等等.

此版本可能会也可能不会向操作系统释放内存; 这是您的编译器/库和操作系统做出的决定.在某些系统上,内存似乎仍然可以分配给您的进程,但如果另一个进程需要,操作系统将能够声明它.

如果你反复调用同一个函数,它不应该累积内存; 以前的delete'd块可以接听new电话.