上下文: 我需要将所有元素从数组移动到新数组。复制后将销毁旧数组。
代码:
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 []是否会破坏内存块而不是逐个元素删除?)?
答案 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)
delete
和delete[]
根本不同(一个不能取代另一个)。
delete a
释放a
指向的内存。
a
|
v
Abcde
delete[]
从a
开始释放数据的内存。
a
|
v
AbcdeAbcdeAbcdeAbcde
第一个不是数组;第二个是数组。