做什么之间有什么区别:
int* I = new int[100];
for (int J = 0; J < 100; ++J)
{
delete I++;
}
//and
int* I = new int[100];
delete[] I;
我知道第一个是错的。我知道如何正确使用delete []与删除。 我只是想知道为什么这些有什么不同。就像弄清楚循环中delete []和delete之间的真正区别。那有什么区别?
答案 0 :(得分:3)
new
和delete
的两个版本都有两个任务:分配/取消分配和构建/销毁。
new
将分配内存并调用构造函数。
delete
将调用解构函数并释放内存。
new []
分配单个内存块,然后可能多次调用构造函数。
delete []
可能会多次调用解构函数,然后释放一块内存。
因此,多次使用delete
意味着释放多个内存块,而使用delete[]
将释放一块内存;多次使用delete
并不等同于使用delete []
。
答案 1 :(得分:2)
不同之处在于,在第一个中,您将删除未从new
返回的指针。
答案 2 :(得分:2)
没有比较点
将delete
用于所有new
s
delete []
的和new []
s
第一个只删除不是来自new
答案 3 :(得分:2)
当您使用new Foo[n]
时,您需要为一大块内存进行单一分配,该内存大到足以容纳n
个Foo
个连续元素的数组。这与分配n
个连续内存块不同,每个Foo
一个。
从内存分配器的角度来看,它实际上只是一个大的分配。当你执行delete array
或delete (array + 42)
时,内存分配器基本上被要求删除包含特定项的大分配部分,而这是不可能的。这就像试图通过delete (&(new Foo())->bar)
释放一个新对象的单个成员一样 - 对象的其余部分会发生什么?
即使在单元素数组上,delete array
也不起作用,因为分配器对数组和单个对象使用不同的簿记逻辑(例如,存储数组中的元素数)。因此,您必须将delete[]
与new[]
和delete
与new
一起使用。
答案 4 :(得分:0)
这是声明一个整数数组:
int* I = new int[100];
这是遍历整数数组并试图删除它们:
for (int J = 0; J < 100; ++J)
{
delete I++; // bad
}
这是删除整数数组:
delete [] I; // correct
由于您使用[]
分配了数组,因此请使用[]
取消分配。在没有[]
的情况下,您不会释放使用[]
分配的内存。
答案 5 :(得分:0)
delete和delete []之间的区别在于delete将调用一个对象的析构函数,而delete []将调用数组中每个对象的析构函数。在整数的情况下,差异并不明显,但如果您在析构函数中有任何后果,那么您将遇到问题,因为您无法正确销毁所有对象。
也就是说,对于简单类型,你仍然不应该使用delete而不是delete [],因为两个运算符的编译代码可能不同(例如,delete []可能希望整数存储在邻近的某个地方数组,指示要删除的对象数)。所以,一般规则是如果你使用new,总是使用delete,如果你使用new [],总是使用delete []。
答案 6 :(得分:0)
第一个示例产生未定义的行为,因为普通删除表达式(与delete []相反)只能应用于以下任一操作数:
对使用new []分配的数组的单个元素调用delete不属于这两个类别中的任何一个,因为数组的元素是未使用单个新表达式创建的非数组对象。
(C ++标准5.3.5)