new / delete / free store和malloc / free / heap组合

时间:2014-04-02 11:46:14

标签: c++ memory-management

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

malloc/free关键字使用堆

我看到new使用malloc的地方。怎么会这样?它们不在内存段中使用?

第二,我看到在free之后我们无法使用new或在delete之后使用malloc。但如果new使用malloc,为什么free无效?

我们在free之后使用new的位置。这是错误还是未定义的行为?

感谢

3 个答案:

答案 0 :(得分:6)

  

new / delete关键字使用免费商店
  malloc / free关键字使用堆
  我看到new使用malloc的地方。怎么会这样?它们不在内存段中使用?

"免费商店" C ++中的术语描述了动态存储持续时间对象所在的位置。术语"堆"是同一件事的口语。 new可以使用malloc,这很好。

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

是的,free未使用new分配的对象未定义,主要是因为free不调用类析构函数。类似地delete使用malloc创建的内容:这样做会混合使用两种不同的分配/构造习惯用法,尽管你可以使它成功,但要强有力地这样做会非常困难。

  

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

因为"堆" (它甚至不是"内存段")可能不是一堆,因此它是一个愚蠢的术语。 C ++试图通过引入抽象"免费存储"来逐步淘汰它。不幸的是,人们一直在说#"堆"因为(a)遗产,(b)复制猫自行车,(c)无视抽象的目的/意义/价值,以及(d)教育/教学不良。

答案 1 :(得分:3)

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

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

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

答案 2 :(得分:1)

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

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

此外,free不会调用析构函数,然后,C ++类可能会提供专门的内存管理,如果将它与malloc / free混合,肯定会中断。​​