new/delete
个关键字使用免费商店
malloc/free
关键字使用堆
我看到new
使用malloc
的地方。怎么会这样?它们不在内存段中使用?
第二,我看到在free
之后我们无法使用new
或在delete
之后使用malloc
。但如果new
使用malloc
,为什么free
无效?
我们在free
之后使用new
的位置。这是错误还是未定义的行为?
感谢
答案 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
混合,肯定会中断。