new / malloc是否会在足够但碎片化的内存环境中导致内存混乱?

问题描述 投票:1回答:1

这只是出于好奇。

例如,假设我们已经耗尽了8个字节的内存中的2个:

[xx------]

如果我调用new / malloc请求3个字节,它应该工作正常,也许是这样:

[xx--xxx-]

如果我调用new / malloc请求另外3个字节,会发生什么?就可用内存而言,仍有3个空闲字节,即使它们不是连续的。然后程序会对内存进行“碎片整理”以为新分配腾出空间吗?听起来不可能,因为我仍然会继续引用现有的alloc。

如果是这样,那么通过扩展到一个极端情况,如果你的内存以某种方式结束超级碎片(例如,每隔一个字节被分配ala [x-x-x-x- x-x-x-x-]),这是否意味着即使有50%的内存空闲也无法分配2个字节?

我认为这个平台不重要吗?

对于扩展的问题感到抱歉,但这种情况是否也会发生在Java / C#等其他语言中?

c++ c memory memory-management out-of-memory
1个回答
0
投票

没错,内存可能变得如此分散,以至于不再可能进行分配。好的分配器会在可能的情况下合并释放的块,以限制碎片。

MS .NET托管框架通过间接分配内存块,即通过指向块的指针的指针来解决这个问题。这样,可以移动块以对内存进行碎片整理,而无需更改指针指针。 (框架需要注意避免并发问题,因为.NET有一个异步运行的垃圾收集器。)

最新问题
© www.soinside.com 2019 - 2024. All rights reserved.