当前位置: 首页 > 知识库问答 >
问题:

为什么'delete[]'存在于C++中?

阎彬炳
2023-03-14

每当有人在这里询问关于delete[]的问题时,总会有一个相当笼统的回答:“C++就是这么做的,使用delete[]”。作为一个普通的C背景,我不明白为什么需要一个不同的调用。

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

没有函数free_array()。我看到过一些与此切线相关的其他问题的疯狂理论,比如调用deletePTR只会释放数组的顶部,而不是整个数组。或者更正确的是,它不是由实现定义的。当然...如果这是C++的第一个版本,并且你做出了一个奇怪的设计选择,这是有意义的。但是为什么$present_year的C++标准没有重载它???

在我看来,C++增加的唯一额外的一点就是遍历数组和调用析构函数,我认为这可能是它的症结所在,它实际上是使用一个单独的函数来为我们节省一个运行时长度查找,或者在列表末尾使用nullptr来换取折磨每一个新的C++程序员,或者那些有一天模糊的、忘记了有一个不同的保留词的程序员。

有没有人可以一劳永逸地澄清一下,除了“标准是这样说的,没有人会怀疑”之外,还有什么理由?

共有1个答案

倪阳飇
2023-03-14

C++中的对象经常有需要在其生存期结束时运行的析构函数。delete[]确保调用了所有这些析构函数。但它具有未指定的开销,而delete没有。这样就会得到两个差异删除器。一个用于数组,它支付开销,一个用于单个对象,它不支付开销。为了只有一个版本,编译器总是需要跟踪对象是否为数组,这可能是一个非零成本。C++的一个基本原则是,用户不应该被迫付出他们不一定要付出的代价。

始终删除新建的和始终删除[]新建的[]。但在现代C++中,newnew[]通常不再使用。使用std::make_uniquestd::make_sharedstd::vector或其他表达能力更强、更安全的替代方法。

 类似资料:
  • 流已经提供了方法来转换为数组,那么为什么不提供和?

  • 问题内容: 在Linux中,为什么标准库需要存根? 问题答案: 需要存根以确保在各种Linux版本之间正确链接可执行文件,而无需构建目标文件。 例如:让a为我们正在构建的可执行文件: 在上述情况下,可执行文件a依赖libz.so(即与libz.so链接)。链接器使用LD_LIBRARY_PATH解析libz.so。 现在让我们看看问题所在: 在RHEL5中,我们在libz.so中看到一个未定义的符

  • 问题内容: 为什么存在MaxPermSize? 问题答案: 我还没有发现任何东西可以表明他们为什么要做出设计来对永久发电量有最大限制的决定。但是我认为这样做是出于几个原因。 它使实现起来更加容易,GC绝对是不平凡的,因此以任何方式简化实现可能是一个好主意。 YAGNI(您可能会需要它)大多数应用程序都加载固定数量的类,并且通常不是特别大,因此它们可能已针对常见情况进行了优化,并选择了合理的默认值并

  • 我们的软件正在通过一个从内存流读取数据的GZipStream解压某些字节数据。这些数据以4KB的块解压缩,并写入另一个内存流。 我们已经意识到进程分配的内存远高于实际解压的数据。 示例:具有2425536字节的压缩字节数组被解压缩为23050718字节。我们使用的内存分析器显示了方法MemoryStream。设置容量(Int32值)分配的67104936字节。这是保留内存和实际写入内存之间的2.9