删除[] arr和删除循环中的元素之间的区别是什么

时间:2014-05-27 02:21:36

标签: c++ arrays

上下文: 我需要将所有元素从数组移动到新数组。复制后将销毁旧数组。

代码:

int* array = new int[5];
int* newArray = new int[5];

选项1:销毁循环中的元素

for (int i = 0; i < 5; ++i) {
  newArray[i] = array[i];
  delete (array + i);
}

选项2:使用delete []

for (int i = 0; i < 5; ++i) {
  newArray[i] = array[i];
}
delete[] array;

问题: 有什么不同? delete []是否比option1更有效(delete []是否会破坏内存块而不是逐个元素删除?)?

2 个答案:

答案 0 :(得分:3)

嗯,选项1表现出未定义的行为,因此区别在于正确的代码和错误的代码之一。

您只能delete(或者,在这种情况下,delete[]new返回的内容。数组的各个元素不是由new返回的(也不是指针)。在delete未返回的指针上调用new,即array + n调用未定义的行为。

new的实现可能会分配比记账请求更多的内存。它得到一个指针p,然后说“好了,现在让我们看一下new为我创建的信息p - sizeof(some_structure)。现在我知道我分配了n个字节记忆因为some_structure.n告诉了我,所以我现在要清理它。“

当它试图在错误的指针上执行此操作时,它会读取废话并且可能发生任何事情。


另外,请注意std::copy复制数组,而不是循环。

答案 1 :(得分:1)

deletedelete[]根本不同(一个不能取代另一个)。

delete a释放a指向的内存。

 a
 |
 v
 Abcde

delete[]a开始释放数据的内存。

 a
 |
 v
 AbcdeAbcdeAbcdeAbcde

第一个不是数组;第二个是数组。