【问题标题】:new, delete ,malloc & free新建、删除、malloc 和免费
【发布时间】:2011-03-12 04:16:50
【问题描述】:

在一次采访中问我这个问题:

在 C++ 中,

  1. 如果我们使用malloc 分配内存并使用delete 释放分配的内存会怎样?
  2. 如果我们使用new 分配内存并使用free 释放它会怎样?

如果在代码中使用上面的东西,我们会遇到什么问题?

我的回答是没有区别。我说的对吗?

【问题讨论】:

  • 这个FAQ 回答了这些确切的问题。
  • 希望您对其他问题的回答正确
  • “没有区别。” -> 这在技术上是正确的,这两点都会导致未定义的行为,所以没有区别:)
  • 因为这是一个面试问题,我不认为他们期望是/否的答案。您应该解释 malloc/free 和 new/delete 的作用、它们有何不同、如何使用它们以及为什么不应该混合使用它们。这将向他们展示您了解 C++ 和 C++ 运行时的工作原理,它与 C 标准库的关系,并且您可以考虑这些问题。因此,用“回答 [...] 没有区别”回答您的问题,您失败了。 :-(

标签: c++ memory-management malloc free new-operator


【解决方案1】:

如果这样做,您将遇到未定义的行为。永远不要那样做。虽然new 可以通过malloc() 实现,delete 可以通过free() 实现,但不能保证它们真的以这种方式实现并且用户也可以重载new 和@ 987654326@ 由他自行决定。您可能会遇到堆损坏。

除此之外不要忘记,当您调用 malloc() 时,您会得到原始内存 - 不会调用构造函数 - 而当您调用 free() 时不会调用析构函数。这也可能导致程序的未定义行为和不正常运行。

底线是......永远不要这样做。

【讨论】:

    【解决方案2】:

    1) 未定义的行为,但可能会“工作”。析构函数将在被释放的可能不想被解构的内存上调用。
    2)未定义的行为,但可能会“工作”。析构函数不会被调用。

    即如果它可以工作,并且不能保证,那么它可能只会完全按照基本内置数据类型的要求工作。

    【讨论】:

      猜你喜欢
      • 2011-02-28
      • 2017-02-25
      • 1970-01-01
      • 2018-02-04
      • 1970-01-01
      • 1970-01-01
      • 2010-09-24
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多