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

时间:2014-11-09 08:52:02

标签: 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];

它使用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次。然后它被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;
}

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

2 个答案:

答案 0 :(得分:6)

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

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

delete[] banned;

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

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

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

答案 1 :(得分:1)

在应用程序中分配内存时,C ++运行时会向操作系统询问“更多内存”。假设您将再次分配更多内存,“如果没有释放大量内存 - 请坚持下去”。换句话说,“任务管理器”和其他此类工具并不适合理解应用程序中实际分配的内存量。

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

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

您为每个delete []拨打vertices,为整个阵列拨打一次,与您的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);

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