【发布时间】:2011-05-21 20:03:40
【问题描述】:
delete [] 实际做了什么让我很困扰,所以我只是尝试了一些代码,结果让我感到震惊
测试#1:
int main()
{
int *d;
while(true)
{
d = new int[10];
delete []d;
}
}
正如预期的那样,该程序根本不消耗任何内存。
测试#2:
int main()
{
int *d;
while(true)
{
d = new int[10];
delete [](d + 5);
}
}
虽然在每个循环中应该至少有 20 个字节(对于它在数组开头保留的五个整数)保留没有被删除,但这个程序也不会消耗任何内存!
测试#3:
int main()
{
int *d;
while(true)
{
d = new int[10];
delete []d;
*d=1;
}
}
这如预期的那样导致了访问冲突(似乎在delete []d之后所有的内存都被删除了)。
测试#4:
int main()
{
int *d;
while(true)
{
d = new int[10];
delete [](d+5);
*d=1;
}
}
这是最神奇的,虽然 while 不消耗任何内存,程序也不会产生任何访问冲突,我只是想知道 *d 将它的数据存储在哪里?
(顺便说一下,所有程序都是使用无优化编译的!)
现在主要问题:
如果我分配了一个数组并且我已经完成了其中一半的工作,我就不能释放那一半并保留另一半吗?
【问题讨论】:
-
除了第一个之外,所有这些都具有未定义的行为。你不能删除任何不是新的东西。
d + 5不是新的,d是。无论如何,您如何确定它是否正在消耗内存?例如,我怀疑它是以千字节为单位报告的,而您分配的不超过千字节,所以它保持不变。 -
如何知道程序是否消耗内存?
-
只需尝试从它们中删除删除,您会发现消耗我所有 4GB 内存的时间不到 1 秒!
-
WTF?!您只能删除您已新建的内容。其他一切都是极其未定义的行为。
-
@Paul:指针消失了,当然,但不是动态分配的内存。
标签: c++ arrays delete-operator