首页 > 解决方案 > 为什么 C++ 中存在 delete[] 语法?

问题描述

每次有人问delete[]关于这里的问题时,总会有一种非常笼统的“C++ 就是这样,使用delete[]”的回答。来自香草 C 背景,我不明白为什么需要进行不同的调用。

使用malloc()/free()您的选项是获取指向连续内存块的指针并释放一块连续内存。实现领域中的某些东西会根据基地址知道您分配的块的大小,以便在您必须释放它时。

没有功能free_array()。我已经看到一些与此相关的其他问题的疯狂理论,例如调用delete ptr只会释放数组的顶部,而不是整个数组。或者更正确的是,它不是由实现定义的。当然……如果这是 C++ 的第一个版本,并且您做出了一个奇怪的设计选择,那是有道理的。但是为什么用$PRESENT_YEAR's 标准的 C++ 没有被重载???

它似乎是 C++ 添加的唯一额外位是遍历数组并调用析构函数,我认为这可能是它的症结所在,它实际上是使用一个单独的函数来为我们节省单个运行时长度查找,或者nullptr在以换取折磨每一个新的 C++ 程序员或程序员谁有一个模糊的日子,忘记了有一个不同的保留词。

如果除了“这就是标准所说的,没有人质疑它”之外还有其他原因,有人可以一劳永逸地澄清吗?

标签: c++memory-managementsyntaxlanguage-lawyerstandards

解决方案


C++ 中的对象通常具有需要在其生命周期结束时运行的析构函数。delete[]确保调用数组每个元素的析构函数。但是这样做有未指定的开销,而delete没有。这就是为什么有两种删除表达式的原因。一种用于数组,它支付开销,另一种用于不支付开销的单个对象。

为了只有一个版本,实现需要一种机制来跟踪有关每个指针的额外信息。但 C++ 的基本原则之一是,用户不应该被迫支付他们并非绝对必须支付的费用。

永远delete是你new,永远delete[]是你new[]。但在现代 C++ 中,new通常new[]不再使用。使用std::make_unique,std::make_sharedstd::vector其他更具表现力和更安全的替代方法。


推荐阅读