新建/删除/免费存储和 malloc/免费/堆组合

new/delete/free store and malloc/free/heap combinations

本文关键字:免费 组合 malloc 存储 删除 新建      更新时间:2023-10-16

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

malloc/free关键字都使用堆

我看到某处写着new使用malloc. 怎么可能? 它们不在内存段中使用?

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

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

谢谢

new/delete关键字使用免费商店
malloc/free关键字使用堆
我看到写在某处,new使用malloc.怎么可能?它们不在内存段中使用?

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

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

是的,未定义free您分配的对象 new ,主要是因为free不调用类析构函数。同样,对于delete你用malloc创建的东西:这样做就是混合两种不同的分配/构造习语,虽然你可以让它工作,但要做到这一点是非常困难的。

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

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

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

至于为什么不混新删,这个答案:https://stackoverflow.com/a/3184129/2050788 给出了一个很好的总结。 为方便起见,复制粘贴:

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

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

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

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