【发布时间】:2019-08-27 03:37:47
【问题描述】:
这只是出于好奇。
例如,假设我们用完了 8 个字节的内存中的 2 个:
[xx------]
如果我调用 new / malloc 请求 3 个字节,它应该可以正常工作,也许像这样:
[xx--xxx-]
如果我调用 new / malloc 请求另外 3 个字节,会发生什么?就可用内存而言,仍有 3 个空闲字节,即使它们不连续。然后程序会“整理”内存为新分配腾出空间吗?听起来不可能,因为我仍然会保留对现有分配的引用。
如果是这样,那么延伸到一个极端情况,如果您的内存以某种方式 最终超级碎片化(例如,每隔一个字节分配 ala [x-x-x-x- x-x-x-x-]),会这意味着尽管有 50% 的可用内存,我什至无法分配 2 个字节?
我认为平台不重要?
很抱歉这个扩展问题,但在 Java/C# 等其他语言中也会发生这种情况吗?
【问题讨论】:
-
我认为这严重依赖于架构。
-
@FantasticMrFox:如果不是所有系统,大多数系统都有一个平面(虚拟)寻址空间。堆块是连续分配的,并通过一个简单的指针访问,因此指针运算很简单。这会导致碎片问题。
-
对于 C/C++ 是。有时 malloc 使用 sbrk 有时它使用 mmap。在所有情况下,它都不能移动数据,因为这会使您的程序正在使用的指针无效。
标签: c++ c memory memory-management out-of-memory