我正在使用MS VS 2010,C ++,非托管。如果可能的话,我想拆分分配的区域。例如,假设我在内存中分配了1KB的空间:
void* space = malloc(1024);
之后,我决定将此块作为单独的512B和512B空间:
space1 = 512B and space2 = 512B
最后当我想摆脱这些空间时,我想分开释放它们:
free(space1);
free(space2);
这可能没有重新分配/扩展/缩小内存吗?
谢谢大家..
答案 0 :(得分:1)
不,你不能单独释放它们,因为malloc()只保留一份必要的簿记数据,所以它只能释放一个块。你必须编写自己的malloc / free包装器。
答案 1 :(得分:1)
简而言之:您必须在malloc / new上编写自己的内存分配器。
较长版本: 由于内存分配器实现不同,因此无法对其内部数据结构进行可移植修改,以跟踪分配的和空闲的块。他们的界限。
例如,有些技术会在每个内存块之前添加少量数据。您无法拆分此类块,因为额外的簿记数据会扩大块的大小。
其他技术将管理数据从块外部放置,例如通过位图,链接列表等。你可能会有更多的运气。
同样,你最好自己编写分配器。
更好的是,如果可能的话,尝试寻找替代方法来管理你的记忆。也许池分配器更像是你需要的东西。
答案 2 :(得分:0)
您可以将Windows API用于堆:http://msdn.microsoft.com/en-us/library/aa366711(VS.85).aspx
HeapAlloc()
相当于malloc
。主要区别在于接收另一个参数:要使用哪个堆。可以使用HeapCreate
创建这些堆,您可以为它们保留空间。