我有一个每次运行时使用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
部分。
答案 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);
现在使用的内存会自动清理。