【问题标题】:Allocate maximum memory available分配最大可用内存
【发布时间】:2019-12-05 07:39:39
【问题描述】:

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

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";

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

最好的问候

老鼠

【问题讨论】:

    标签: algorithm memory memory-leaks malloc


    【解决方案1】:

    您没有指定操作系统或平台,所以我完全是在猜测这里,所以请带着极大的偏见阅读......

    假设您的二进制搜索代码中没有错误...我敢打赌您面临 内存碎片 问题,因为您在执行期间成功分配/释放内存,其他进程也可以这样做你可能会碎片化你的记忆。示例:

    1. 操作系统有 2 MB 的连续可用内存块
    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 但是操作系统在单个连续块中没有 1.25 内存,因此它失败了,因此您再次分配 1MByte (0.499 MByte free)
    6. 您成功分配了 1 KB(0.498 MByte 免费)

    根据操作系统的内存管理策略,您有时甚至不需要另一个进程来干扰内存碎片...

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

    【讨论】:

    • 非常感谢您的详细回答。为了完整起见,我想提一下我正在开发一个 Windows x86 应用程序。我最初的意图是强制执行以下测试所需的内存泄漏。然而,这个测试只有在没有更多可用内存的情况下才能成功。是否有另一种简单的方法来通过 malloc 命令请求一个额外的字节并返回一个 NULL 指针来强制执行内存泄漏?
    • @RatbaldMeyer 内存泄漏只是重复(在循环/事件/线程中):分配内存而不释放它,这会随着时间的推移减少可用内存,直至没有剩余可用 RAM ......所以只需在一些线程循环中分配 100 字节,并在一些睡眠或计时器中分配 100 字节,这将随着时间的推移逐渐减少可用内存......顺便说一句,在 Windows 上有:GlobalMemoryStatusEx 但很难说它在 WOW64 的情况下是如何工作的(32 位应用程序开启64位操作系统)
    猜你喜欢
    • 2023-03-20
    • 2014-12-29
    • 2023-03-20
    • 2010-10-30
    • 1970-01-01
    • 2020-08-07
    • 2023-03-03
    • 2014-10-10
    • 1970-01-01
    相关资源
    最近更新 更多