`delete[]` 不是 `new[]` 的对应物吗?

Isn't `delete[]` the counterpart to `new[]`?

我正在阅读以复习已有近 2 年历史的 C++ 知识,以便了解有关工厂模式的在线信息。最终的使用上下文可能会使用不同的第三代语言 (3GL),但根据我过去的经验,我认为遵循 C++ 比(比如)Java 更容易,尽管后者可能不那么复杂句法。然而,一个更大的原因是,我能找到的正在解决的问题的唯一代码示例,即在没有工厂模式的情况下,是在 C++ 中。大多数帖子在高层次叙述中谈论模式的原因,然后提供代码来展示模式的机制而不是在没有模式的情况下的问题。

我正在研究的代码位于 here. 我无法理解 delete[] 用于销毁对象这一事实使用 new 创建的。根据各种阅读,deletenew一起使用,delete[]new[]一起使用。然而,在远离 C++ 这么久之后,我很容易忽略一些明显的东西。 引用的代码可以吗,还是我说的对?

我在 newdelete 上的读数是:

Isn't delete[] the counterpart to new[]?

是的。

delete is used with new, and delete[] is used with new[]

正确。

虽然迂腐,但是delete[]是为了删除数组。 new T[]总是分配一个数组,但是如果T是数组类型,new T也可以分配一个数组。但这种特殊情况不适用于链接的文章。文章有未定义的行为。


文章中的错误还不止于此。还有更多。例如,通过指向派生对象的基子对象的 Vehicle 指针删除的行为是未定义的,因为 Vehicle 的析构函数是非虚拟的。

此外,Client 是可复制的,但它的复制构造函数和赋值运算符违反了 class 唯一性不变式,这是析构函数有效所必需的。