delete[]在C++中真的有效吗
Does delete[] really work in C++?
我有一个函数,每次运行它都会使用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);
现在使用的内存会自动清理。
- 欧拉项目#8答案是大以获得有效答案
- 调整大小后指向元素值的指针unordered_map有效?
- 为什么是0;C++中的有效语句
- 最高有效数字侧的第N位
- GCC对可能有效的代码抛出init list生存期警告
- 在决定是通过参考还是通过价值时,尺寸真的是一个问题吗
- 有效地使用std::unordered_map来插入或增加键的值
- c++中O(n^(1/3))中一个数的除数的有效计数
- 使用无符号字符数组有效存储内存
- 自定义先决条件对移动分配运算符有效吗
- 为什么将值返回函数传递给重载=运算符对运算符函数有效,而对其他运算符无效
- 有哪些有效的方法可以消除一组 100 万个字符串>重复数据?
- 为什么这种直接初始化有效?(C++17)
- 递归函数有效,但无法记忆
- 在C++中初始化向量映射的最有效方法
- 字节真的是最小可寻址单元吗
- static_cast:转换函数模板——它们真的有效吗
- delete[]在C++中真的有效吗
- 在C++中的函数调用内部执行强制转换时,强制转换是否真的有效
- 在64位x 64位乘法中使用Karatsuba算法真的有效吗