c++ - 为什么我们甚至需要 "delete[]"运算符?

标签 c++ arrays memory-management heap-memory

这是一个困扰我一段时间的问题。我一直认为 C++ 的设计应该使 delete 运算符(不带括号)即使与 new[] 运算符一起使用。

在我看来,写这个:

int* p = new int;

应该相当于分配一个包含 1 个元素的数组:

int* p = new int[1];

如果这是真的,delete 操作符可以一直删除数组,我们就不需要 delete[] 操作符了。

在 C++ 中引入 delete[] 操作符有什么原因吗?我能想到的唯一原因是分配数组的内存占用很小(您必须将数组大小存储在某处),因此区分 deletedelete[] 是一个小的内存优化。

最佳答案

这样会调用各个元素的析构函数。是的,对于 POD 数组,没有太大区别,但在 C++ 中,您可以拥有具有非平凡析构函数的对象数组。

现在,你的问题是,为什么不让 newdelete 表现得像 new[]delete[] 并摆脱 new[]delete[]?我会回到 Stroustrup 的“设计和进化”一书中,他说如果你不使用 C++ 特性,你不应该为它们付费(至少在运行时)。就目前而言,newdelete 将与 mallocfree 一样有效。如果 delete 具有 delete[] 的含义,那么在运行时会有一些额外的开销(正如 James Curran 指出的那样)。

关于c++ - 为什么我们甚至需要 "delete[]"运算符?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/252515/

相关文章:

python - 在 numpy 中将数组拼接在一起

php - "Notice: Undefined variable"、 "Notice: Undefined index"、 "Warning: Undefined array key"和 "Notice: Undefined offset"使用 PHP

c++ - 内存管理和 std::allocator

memory-management - RCU 作为传统垃圾收集的替代方案

c++ - 使用指向 STL 映射的指针的操作

c++ - 如何在十六进制字符数组中插入十六进制值

c++ - VirtualAlloc 在某些硬盘配置上失败

javascript - 从 State 数组获取特定值时未定义 - React Native

c++ - 增长数组 C++ 的最有效方法

c++ - ITK imageSeriesReader 无法读取dicom系列