c++ - 为什么 C++ 中存在 delete[] 语法?
问题描述
每次有人问delete[]
关于这里的问题时,总会有一种非常笼统的“C++ 就是这样,使用delete[]
”的回答。来自香草 C 背景,我不明白为什么需要进行不同的调用。
使用malloc()
/free()
您的选项是获取指向连续内存块的指针并释放一块连续内存。实现领域中的某些东西会根据基地址知道您分配的块的大小,以便在您必须释放它时。
没有功能free_array()
。我已经看到一些与此相关的其他问题的疯狂理论,例如调用delete ptr
只会释放数组的顶部,而不是整个数组。或者更正确的是,它不是由实现定义的。当然……如果这是 C++ 的第一个版本,并且您做出了一个奇怪的设计选择,那是有道理的。但是为什么用$PRESENT_YEAR
's 标准的 C++ 没有被重载???
它似乎是 C++ 添加的唯一额外位是遍历数组并调用析构函数,我认为这可能是它的症结所在,它实际上是使用一个单独的函数来为我们节省单个运行时长度查找,或者nullptr
在以换取折磨每一个新的 C++ 程序员或程序员谁有一个模糊的日子,忘记了有一个不同的保留词。
如果除了“这就是标准所说的,没有人质疑它”之外还有其他原因,有人可以一劳永逸地澄清吗?
解决方案
C++ 中的对象通常具有需要在其生命周期结束时运行的析构函数。delete[]
确保调用数组每个元素的析构函数。但是这样做有未指定的开销,而delete
没有。这就是为什么有两种删除表达式的原因。一种用于数组,它支付开销,另一种用于不支付开销的单个对象。
为了只有一个版本,实现需要一种机制来跟踪有关每个指针的额外信息。但 C++ 的基本原则之一是,用户不应该被迫支付他们并非绝对必须支付的费用。
永远delete
是你new
,永远delete[]
是你new[]
。但在现代 C++ 中,new
通常new[]
不再使用。使用std::make_unique
,std::make_shared
或std::vector
其他更具表现力和更安全的替代方法。
推荐阅读
- laravel - 使用观察者请求验证
- python - How to update requirements?
- javascript - 取消选中复选框后如何从数组中删除元素
- xamarin.ios - Xcode 11 更新后 Xamarin iOS 模拟器黑屏
- sql - 如何在 Asp.net Mvc 中显示没有模型的数据?
- rest - rest - 将用户限制在自己的数据中的方法
- java - 如何在 Spring MVC Web 应用程序中创建会话范围的调度程序?
- python - 如何像在 ggplot 中一样在 matplotlib 中创建堆积条形直方图
- node.js - 提交表单时无法发布/注册错误 - NodeJs
- amazon-web-services - API网关将某些IP列入白名单