【发布时间】:2015-12-07 03:47:43
【问题描述】:
这个问题是作为 Does delete[] deallocate memory in one shot after invoking destructors? 的一部分提出的,但作为一个单独的问题移出。
似乎(如果错了请纠正我)delete 和delete[] 之间的唯一区别是delete[] 将获取数组大小信息并在所有这些上调用析构函数,而delete 将破坏唯一的第一个。特别是,delete 还可以访问有关new[] 分配的总内存量的信息。
如果不关心破坏动态分配的数组元素,只关心new 或new[] 分配的内存被释放,delete 似乎能够做同样的工作。
这个How does delete[] "know" the size of the operand array? 问题的已接受答案有一条来自@AnT 的评论,我引用了
还请注意,数组元素计数器仅适用于具有非平凡析构函数的类型。对于具有平凡析构函数的类型,计数器不会被 new[] 存储,当然,也不会被 delete[] 检索
此评论表明,通常delete 表达式知道分配的整个内存的数量,因此知道最终一次性释放多少内存,即使内存包含一个数组的元素。所以如果有人写
auto pi = new int[10];
...
delete pi;
尽管标准认为这是 UB,但在大多数实现中,这不应该泄漏内存(尽管它不可移植),对吧?
【问题讨论】:
-
为什么这转移到一个单独的问题?
-
内存泄漏与内存碎片不同。您可能由于碎片而没有可用内存,但仍然没有内存泄漏。
-
即使它能够释放内存,为什么你不想破坏对象?为什么标准委员会会足够关心这种行为来定义它?
-
@EdHeal 这是
delete特有的。正如@black 在链接问题中所建议的那样,我应该将单独个问题移出。 -
本质上是同一个问题。您假设
delete和delete[]将“重新分配”内存,就好像两个运算符都知道要以相同方式重新分配的内存大小一样。它们有可能以完全不同的方式实现吗?还有为什么不修复代码。
标签: c++ memory-management