c++ - delete[] arr 和循环删除元素有什么区别

标签 c++ arrays

<分区>

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

代码:

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

方案一:在循环中销毁元素

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[] 是否会破坏内存块而不是逐个元素地删除?)?

最佳答案

好吧,选项 1 表现出未定义的行为,所以区别在于正确代码和错误代码之一。

您只能删除(或者,在本例中,delete[])从new 返回的内容。数组的各个元素不是由 new 返回的(它们也不是指针)。在 new 未返回的指针上调用 delete,即 array + n 调用未定义的行为。

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

当它尝试在您给它的错误指针上执行此操作时,它会读取无意义的内容,并且任何事情都可能发生。


附带说明,更喜欢 std::copy 来复制数组,而不是循环。

关于c++ - delete[] arr 和循环删除元素有什么区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23880154/

相关文章:

c++ - cppreference 中的哪一部分告诉我结构化绑定(bind)声明仅适用于编译时已知对象?

python - python中大数组的计算

javascript - 显示 AJAX 的不同数组描述的控制台

javascript - 如何将数组转换为数学计算表达式?

c++ - 完美转发到函数指针调用

c++ - 使用 "getchar()"打印错误后调用 "fprintf"有什么意义?

c++ - std::getline 在最后一次出现定界符后跳过来自 std::cin 的输入,但不使用来自 std::istringstream 的输入

c++ - boost::bool_testable<> 是否被重新定位或移除?

arrays - 检查 Swift 数组是否包含对象实例

java - 如何让我的数组正确排序?递归排序