【问题标题】:split malloc mem space拆分 malloc 内存空间
【发布时间】:2010-12-06 15:07:36
【问题描述】:

我正在使用 MS VS 2010、C++、非托管。如果可能的话,我想分割分配的区域。例如,假设我在内存中分配了 1KB 空间:

void* space = malloc(1024);

后来,我决定将这个块作为单独的 512B 和 512B 空间:

space1 = 512B and space2 = 512B

最后,当我想摆脱这些空间时,我想分别释放它们:

free(space1);
free(space2);

如果不重新分配/扩展/收缩内存,这可能吗?

谢谢大家..

【问题讨论】:

    标签: c++ split malloc


    【解决方案1】:

    不,你不能单独释放它们,因为 malloc() 将只保留一份必要的簿记数据的副本,因此它只能释放一个块。您必须编写自己的 malloc/free 包装器。

    【讨论】:

    • 那很快 :) 我希望有一个解决方案。。好吧,这会等到;我开始写内存管理器而不是 ..thnx。
    • @MCA,习惯上使用已收到的票数下方的复选标记来接受您喜欢的答案。由于 DeadMg 的答案似乎是您认为满足您当前需求的答案,因此您应该接受它。
    • 哦,对不起..我是这个网站的新手..我没有注意到我应该选择一个答案..
    • @MCA:为什么每个人和他们的兄弟都想重写内存管理器。它花了将近 40 年才达到目前的状态(并且非常有效)。你不能做得更好(除非你有一个博士候选人团队和四十年)所以不要尝试。
    • 因为 windows api 没有做我想做的事。我可以拆分分配的内存。我实际上有点需要更高的性能,所以我使用 Virtual Alloc 分配一次内存并以我自己的方式使用它。这样我就可以高效管理xbox内存和pc内存了。
    【解决方案2】:

    简而言之:您必须在 malloc/new 之上编写自己的内存分配器。

    更长的版本: 由于内存分配器实现不同,因此无法可移植地修改其内部数据结构,以跟踪已分配和空闲块及其边界。

    例如,有一些技术可以在每个内存块中添加少量数据。您不能拆分这样的块,因为额外的簿记数据会扩大块的大小。

    其他技术将其管理数据放置在块的外部,例如位图、链表等。你可能有更多的运气。

    同样,您最好编写自己的分配器。

    更好的是,如果可能的话,尝试寻找替代方法来管理你的记忆。也许池分配器是您更需要的东西。

    【讨论】:

    • +1 池适用于相同大小的块或对象集合
    【解决方案3】:

    您可以将 Windows API 用于堆:http://msdn.microsoft.com/en-us/library/aa366711(VS.85).aspx

    HeapAlloc() 等同于malloc。主要区别在于接收另一个参数:使用哪个堆。这些堆可以使用HeapCreate 创建,您可以为它们预留空间。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-05-14
      • 2019-08-13
      • 2021-05-21
      • 2014-03-14
      • 2012-12-26
      • 1970-01-01
      • 2011-08-09
      • 2013-02-23
      相关资源
      最近更新 更多