【发布时间】:2021-08-07 05:12:31
【问题描述】:
每当有人在这里问关于delete[] 的问题时,总会有一种非常笼统的回答“C++ 就是这样,使用delete[]”。来自 vanilla C 背景,我不明白为什么需要进行不同的调用。
使用malloc()/free(),您的选择是获取指向连续内存块的指针并释放连续内存块。实现中的某些东西会根据基地址知道您分配的块大小,以便您必须释放它。
没有函数free_array()。我已经看到一些与此相关的其他问题的疯狂理论,例如调用delete ptr 只会释放数组的顶部,而不是整个数组。或者更正确的是,它不是由实现定义的。当然……如果这是 C++ 的第一个版本,并且您做出了一个奇怪的设计选择,那是有道理的。但是为什么$PRESENT_YEAR的C++标准没有被重载???
这似乎是 C++ 添加的唯一额外位是遍历数组并调用析构函数,我认为这可能是它的症结所在,它实际上是使用单独的函数来为我们节省单个运行时长度查找, 或列表末尾的nullptr,以换取折磨每一个新的 C++ 程序员或程序员谁有一个模糊的日子,忘记有不同的保留词。
如果除了“这是标准所说的,没有人质疑它”之外还有其他原因,有人可以一劳永逸地澄清吗?
【问题讨论】:
-
如果你想测试你的内存分配和释放看看那些疯狂的理论是否正确,你可以使用 Valgrind 来看看实际发生了什么。我怀疑重载删除问题比目前答案中描述的要多,但我没有专业知识。
标签: c++ memory-management syntax language-lawyer standards