【问题标题】:Any possible use of free() with new & delete with malloc()? [duplicate]任何可能使用 free() 与 new & delete 与 malloc()? [复制]
【发布时间】:2017-01-02 16:38:49
【问题描述】:

在最近的一次采访中,面试官问我是否可以使用 free() 来释放之前使用 new 分配的空间。我的回答是肯定的。 :|

我知道这对像 malloc() - free() & new - delete 一样工作。

  • 但是由于两者都使用了一些指针机制,那么混合它们有什么问题呢?

  • 必须有可能在混合两对时实现解除分配。可能吗?即使在理论上? 混合它们的可能场景是什么?

  • 如果可以做到前面所说的,那我们为什么要引入 delete 和 new 呢?

请就这个主题给我启发,如果有任何可用的 new/delete/malloc/free 源代码或任何全面的指南来掌握这个特定主题,请提供链接。

  • 我的另一个好奇心是,删除的注意事项和问题是什么?

【问题讨论】:

标签: c++ c heap-memory dynamic-memory-allocation


【解决方案1】:
  1. 一方面,它们可能使用完全不同的堆。在我们的不止一个应用程序中,全局 newdelete 被重新定义以执行一些额外的簿记;如果您将new 返回的指针传递给free,则它不会被识别为来自malloc 的内容,因为我们在每个内存块的开头保留了额外的信息。标准库也可以这样做。
  2. 为什么应该有?如前所述,它们返回的内存可以来自不同的堆,因此使用其中一个来释放另一个堆是没有意义的。现在,if 您正在分配 POD 类型,而 if 全局 new 运算符只是 malloc 的一个薄包装,理论上它可能意外 em> 努力使用freefor 分配给new 的内存,但除了增加混乱(和潜在的未定义行为)之外,我真的没有看到这样做的意义。
  3. newdelete 被引入作为操作符来处理非 POD 类型。如果你想要的只是“原始”内存malloc(或者,一般来说,一个函数)很好,但如果你想分配 objects 东西会变得更加复杂;分配机制必须知道分配数据的类型,而不仅仅是所需的大小,因为它必须调用构造函数(delete 也一样,它必须调用析构函数,尽管 new 可能刚刚保存指向析构函数的函数指针)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-04
    • 2011-02-02
    • 2016-04-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多