分配最大可用内存

Allocate maximum memory available

我目前正在尝试编写一个应该分配最大可用内存的程序。我找到了一个解决方案,它限制了潜在可用内存的区域,直到两个边界相等(见列表)

void enforceMemoryLeakage(void** arrayOfAllocMemory)
{
    unsigned int maxMemory = 0x80000000;
    unsigned int minMemory = 0x50000000;
    unsigned int attempAllocatedMemory = minMemory + (maxMemory - minMemory) / 2;
    void* pAllocMemory;

    while((maxMemory - minMemory) > 1)
    {
        pAllocMemory = malloc(attempAllocatedMemory);

        if (pAllocMemory != NULL)
        {
            minMemory = attempAllocatedMemory;
            attempAllocatedMemory += (maxMemory - minMemory) / 2;
            free(pAllocMemory);
        }
        else
        {
            maxMemory = attempAllocatedMemory;
            attempAllocatedMemory = minMemory + (maxMemory - minMemory) / 2;
        }
    }
    arrayOfAllocMemory[0] = malloc(maxMemory);
    void* pAllocAdditionalMemory = malloc(100);

    if (pAllocAdditionalMemory == NULL)
        std::cout << "Maximum memory: " << minMemory << "\n";
}

上面显示的代码工作正常。但是如果执行命令

void* pAllocAdditionalMemory = malloc(100);

if (pAllocAdditionalMemory == NULL)
    std::cout << "Maximum memory: " << minMemory << "\n";

我原以为没有更多可用内存。但是它不起作用,这让我想到了我的实际问题,为什么上面显示的方法不起作用。

此致

秃头

您没有指定 OS 也没有指定平台,所以我完全是猜测,所以请带着极端偏见阅读...

假设您的二进制搜索代码中没有错误...我敢打赌您在执行期间成功 allocate/free 内存时会遇到 内存碎片 问题其他进程可以做同样的事情,所以你可能会碎片化你的记忆。示例:

  1. OS 有 2 兆字节的连续可用内存块
  2. 您分配了 1.5 MByte 的内存(0.5 MByte 免费)
  3. 一些其他进程分配 1 KB(0.499 MByte 空闲)
  4. 您释放了 1 MByte(1.0 + 0.499 MByte 释放了两个片段)
  5. 并尝试分配 1.25 MByte 但是 OS 在单个连续块中没有 1.25 内存,因此失败,因此您再次分配 1MByte(0.499 MByte 空闲)
  6. 您成功分配了 1 KB(0.498 MByte 免费)

根据 OS 内存管理策略,您有时甚至不需要另一个进程干扰内存碎片...

然而,还有另一种与碎片无关的可能性。在仿真或 WOW64 的情况下,OS 不会分配整个可用 RAM,而且单个连续块大小也有限制。例如,Win32 不允许超过 ~1.25 GByte,但这并不意味着只有 1.25 GByte 的可用 RAM ...