【发布时间】:2015-03-23 10:29:08
【问题描述】:
这是一个解释问题的简单示例(使用 c++):
A* a1 = new A;
A* a2 = new A;
A* a3 = new A;
delete(a2);
B* b = new B;
.
.
.
假设A 对象的大小是 3,
B 对象的大小为 4,
我的堆大小是 12,
删除a2后,内存是这样的:
XXX---XXX---
即使有足够的内存,我也无法创建对象B* b,因为它不是连续的。
只是一个简单的内存碎片示例。
我可以通过创建某种reallocate() 函数来动态避免这种情况吗?
一个可以“移动”对象a3的内存并将其放在a之后的函数:
XXXXXX-----
删除a2后显然应该调用该函数,所以也许重新实现deallocate()或delete()可以做到这一点,请问我该怎么做?
这只是一个非常简单的例子来展示我正在处理的问题
【问题讨论】:
-
让您的操作系统处理内存碎片。不要尝试和第二次猜测。如果您真的想做某事,请创建一个 std::vector 并使用它。您可以使用另一个 int 向量来存储“已删除”对象的索引。
-
这只是一个简单的例子,我实际上在做一个非常大的项目
-
首先,您需要证明碎片对您的软件来说是个问题。完成后,如果您不喜欢操作系统的分配/重新分配策略,您可以自己制作。我不会尝试为您的项目破解操作系统内存管理器。
-
你能给我一个简单的例子来说明如何改变分配/重新分配策略吗?以及如何破解操作系统内存管理器? (我可能不得不这样做,我只是这个项目的实习生,有很多专家会帮助我)
-
在这种情况下,在数组或向量中创建对象,以便将它们放置在一个内存块中。
标签: c++ memory dynamic-memory-allocation realloc heap-fragmentation