【问题标题】:Isn't `delete[]` the counterpart to `new[]`?`delete[]` 不是 `new[]` 的对应项吗?
【发布时间】:2020-07-18 18:06:52
【问题描述】:

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

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

我对@9​​87654330@ 和delete 的阅读是:

【问题讨论】:

  • 你是对的。那篇文章不正确,是UB
  • Geeks for Geeks 是一个非常糟糕的网站。我建议避免它。 (除非你的学习风格最好由一些权威提供错误信息和错误代码,然后你通过找出他们在哪里误导你来学习。那么我认为这是一个很好的网站。)
  • deletedelete[] 做的第一件事就是测试 null。这使得 Client 析构函数中的大部分代码几乎无用。
  • @sweenish,如果你在析构函数中两次,你已经在前面被冲洗了。
  • @sweenish 在删除之前永远不需要检查 null。删除 null 无效。它永远不会出现段错误。

标签: c++ new-operator delete-operator


【解决方案1】:

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

是的。

delete与new一起使用,delete[]与new[]一起使用

正确。

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


这甚至不是文章中的错误结束的地方。还有更多。例如,通过指向派生对象的基础子对象的Vehicle 的指针进行删除的行为是未定义的,因为Vehicle 的析构函数是非虚拟的。

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

【讨论】:

  • 您回答中的一些后续细节超出了我对 C++ 的新生,但感谢您的警告。我将尝试解析,但请记住,我只需要对工厂模式的概念性理解,即可遵循 4GL 和 3GL 之间的 API 文档。谢谢。
  • @user2153235 这意味着new 的使用暂时超出了您的理解范围。没关系,它的使用是一个先进的概念。我建议熟悉 RAII。
  • @user2153235 每当您遇到使用new 搜索某些内容(例如工厂模式)的示例时,请重复搜索,但在查询中添加“智能指针”。这通常会引导您使用现代(C++11 后)解决方案。
  • 我可以忽略 C++ 特有的复杂内存管理问题。我更多的是试图找到一个现实的用例,在这个用例中,对工厂的需求不能被轻易规避。仍然为此撰写单独的问题。谢谢。
猜你喜欢
  • 2011-05-27
  • 2015-01-16
  • 2013-05-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多