delete[]在C++中真的有效吗

Does delete[] really work in C++?

本文关键字:真的 有效 C++ delete      更新时间:2023-10-16

我有一个函数,每次运行它都会使用0.5 MB的内存。所以我决定通过同时查看Windows任务管理器来逐步研究它。我注意到在这些行之后:

int **banned;
banned=new int*[vertices];
for(i=0;i<vertices;i++)
    banned[i]=new int[k_colors];

它使用0.5 MB内存。然后我决定在return行之前删除它:

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

使用函数开头时的内存为8.5 MB。分配后,它变成了9 MB,但删除部分后,它仍然是9 MB。我在整个程序中执行了1000次这个函数。然后它就被操作系统杀死了。知道为什么会这样吗?我该怎么解决?

编辑:这里是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;
}

上面,在elitism()函数中,第一行是分配部分,最后一行是delete部分。

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

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

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

此版本可能会也可能不会向操作系统释放内存;这是由编译器/库和操作系统做出的决定。在某些系统上,内存可能看起来仍然分配给您的进程,但如果另一个进程需要,操作系统可以申请。

如果你反复调用同一个函数,它不应该积累内存;先前的CCD_ 6’d块可以应答CCD_。

当您在应用程序中分配内存时,C++运行时会要求操作系统提供"更多内存"。假设您将再次分配更多内存,"如果没有释放大量内存,请抓住它"。换句话说,"任务管理器"和其他这样的工具对于准确了解应用程序中实际分配了多少内存并不理想。

然而,delete []确实适用于所有商业级发布的编译器环境。

代码中的问题是您正在删除未分配的内容。

您为每个vertices调用delete [],为整个阵列调用一次,以匹配您的new调用。[每个地方都有一个new,应该有完全相同的delete-相同的次数,相同的指针]

也有可能你正在"分割"内存——例如像这样的东西

size_t s = 100;
for(;;)
{
    int *p = new int[s];
    ...
    delete [] p; 
    s += 10;
}

因此,释放的内存对于下一次分配来说"太小"。

当然,使用可以避免这种混乱

vector< vector <int> > banned(vertices);
for(i=0;i<vertices;i++)
   banned[i].resize(k_colors);

现在使用的内存会自动清理。