【问题标题】:new/delete/free store and malloc/free/heap combinationsnew/delete/free store 和 malloc/free/heap 组合
【发布时间】:2014-04-02 11:46:14
【问题描述】:

new/delete关键字使用免费商店

malloc/free关键字使用堆

我看到某处写着new 使用malloc。怎么会这样?它们不在内存段中使用?

其次,我看到某处写着我们不能在new 之后使用free 或在malloc 之后使用delete。但是如果new 使用malloc 为什么free 将不起作用?

以及我们在new 等之后使用free 的地方。这是错误还是未定义的行为?

谢谢

【问题讨论】:

  • 这是一个简单的黑盒抽象。 new 可能会使用 malloc,但你不能依赖它。另外,malloc 不会调用析构函数。
  • 但他们使用其他内存段?他们怎么能一起工作?
  • 耐心点,不要重复你的问题。
  • @asafapp:向下滚动。

标签: c++ memory-management


【解决方案1】:

new/delete 关键字使用免费存储
malloc/free 关键字使用堆
我看到某处写着new 使用malloc。怎么会这样?它们不在内存段中使用?

C++ 中的“免费存储”是一个术语,用于描述动态存储持续时间的对象所在的位置。术语“堆”是同一事物的俗称。 new 可以使用malloc,这很好。

但是,它也做其他事情,例如调用构造函数,并且可能会使用其他内存管理系统(例如内存池)来代替 malloc

是的,您使用new 分配的对象free 是未定义的,主要是因为free 不调用类析构函数。类似地,deleteing 你用malloc 创建的东西:这样做将混合两种不同的分配/构造习惯用法,虽然你可以让它工作,但要健壮地这样做是非常困难的。

为什么这个内存段有两个名字?

因为“堆”(甚至不是“内存段”)可能不是堆,所以这是一个愚蠢的术语。 C++ 试图通过引入抽象“免费存储”来逐步淘汰它。不幸的是,人们一直在说“堆”,因为 (a) 遗产,(b) 抄袭自行车,(c) 对抽象的目的/意义/价值的无知,以及 (d) 教育/指导不佳。

【讨论】:

  • 为什么这个内存段有两个名字?
  • @asafapp:因为“堆”可能不是堆,所以这是一个愚蠢的术语。 C++ 试图通过引入抽象“免费存储”来逐步淘汰它。不幸的是,人们一直在说“堆”,因为 (a) 遗留问题,(b) 抄袭自行车,(c) 对抽象的目的/意义/价值的无知,以及 (d) 教育/指导不佳。
  • 因为标准喜欢保持抽象,而不是将事物与具体实现联系起来。 e) 因为在实践中,它是堆。
  • 另外,它不是内存段。它只是空闲内存的一个抽象名称,不管它来自哪里,也不管它是否都来自同一个地方。
  • @asafapp:因为人很傻,世界很大。那里有很多的错误信息。
【解决方案2】:

关于您的第一个问题:免费存储和堆是同义词。例如:http://en.wikipedia.org/wiki/Heap_%28programming%29。所以没有矛盾。

至于为什么不将new和delete混合使用,这个答案:https://stackoverflow.com/a/3184129/2050788给出了一个很好的总结。为了您的方便,复制粘贴:

如果这样做,您将遇到未定义的行为。永远不要那样做。尽管 new 可以通过 malloc() 实现,而 delete 可以通过 free() 实现,但不能保证它们确实以这种方式实现,并且用户可以自行决定重载 new 和 delete。您可能会遇到堆损坏。 除此之外,不要忘记,当您调用 malloc() 时,您会得到原始内存 - 没有调用构造函数 - 而当您调用 free() 时,不会调用析构函数。这也可能导致程序的未定义行为和不正常运行。 底线是......永远不要这样做。

【讨论】:

    【解决方案3】:

    简而言之:从不结合这些内存管理方法。也就是说,永远不要在通过new 分配的内存上使用free,反之亦然。

    现在一些 C++ 标准库实现实际上确实使用malloc 实现了operator new,因此它在某些情况下可能在某些平台上有效,但您不能依赖它,因为既不能保证也不需要实现这样做。

    另外,free 不会调用析构函数,然后,C++ 类可能会提供专门的内存管理,如果与malloc/free 混合使用肯定会破坏。

    【讨论】:

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