在for循环中删除[] vs delete

时间:2013-09-20 18:05:00

标签: c++

做什么之间有什么区别:

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之间的真正区别。那有什么区别?

7 个答案:

答案 0 :(得分:3)

newdelete的两个版本都有两个任务:分配/取消分配和构建/销毁。

  • 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]时,您需要为一大块内存进行单一分配,该内存大到足以容纳nFoo个连续元素的数组。这与分配n个连续内存块不同,每个Foo一个。

从内存分配器的角度来看,它实际上只是一个大的分配。当你执行delete arraydelete (array + 42)时,内存分配器基本上被要求删除包含特定项的大分配部分,而这是不可能的。这就像试图通过delete (&(new Foo())->bar)释放一个新对象的单个成员一样 - 对象的其余部分会发生什么?

即使在单元素数组上,delete array也不起作用,因为分配器对数组和单个对象使用不同的簿记逻辑(例如,存储数组中的元素数)。因此,您必须将delete[]new[]deletenew一起使用。

答案 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)