c++ - delete[] 是否在调用析构函数后一次性释放内存?

标签 c++ memory-management

据我所知,当我们在由相应的new []创建的指针上写入delete []时,程序将在数组中查找记帐信息并找出数组的元素大小(一个计数器)。然后程序对它们中的每一个调用元素的析构函数。最后,内存(什么内存??)由名为 operator delete 的函数释放。

我想问的是 delete[] 是否会在 一次 中释放由 new[] 表达式分配的整个内存因为该信息(总内存量)在所有元素都被销毁后可用,还是它会成功释放调用析构函数的数组元素占用的内存?

相关后续问题被问到Does delete (non array form) know the total amount of memory allocated by either new or new[]

最佳答案

所有内存将立即释放给底层分配器。这是 C++ 标准强制要求的,尽管不是特别明确。 N3337是最接近在线免费提供的官方 C++11 标准的近似值。查看第 5.3.5 节 [expr.delete],它详细说明了 delete[] 调用扩展到的代码。特别是,operator delete[] 在第 7 步被调用一次 为数组的所有元素调用析构函数之后(第 6 步) .

您还可以从 18.6.1.2 [new.delete.array] 中关于哪些指针有效传递给 operator delete[] 的措辞中推断出此行为:“... 应该是先前调用 operator new[] 返回的值(...注意事项...)”。由于 operator new[] 返回一个指向整个数组的指针,因此 operator delete[] 也必须对整个数组调用一次。

关于c++ - delete[] 是否在调用析构函数后一次性释放内存?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32507684/

相关文章:

c++ - 函数重新分配 c 字符串后 delete[] 时出现无效指针错误

c - heapusage 检测到可能由 printf 引起的内存泄漏

c++ - 二叉搜索树(BST)

c++ 无法将指针数组初始化为 null c++

c++ - 合并排序无法正常工作

c++ - SDL 窗口立即关闭

iphone - 对于 UIViewController 哪些方法应该是 "release"并将导出/实例变量设置为 "nil"?

memory-management - Glassfish 上的内存管理

c++ - 忽略使用函数名称定义宏的参数

ios - ARCGIS iOS - map 图层内存问题