Algorithm 分配最大可用内存

Algorithm 分配最大可用内存,algorithm,memory,memory-leaks,malloc,Algorithm,Memory,Memory Leaks,Malloc,我目前正在尝试编写一个程序,该程序应该分配最大可用内存。我找到了一个解决方案,它限制潜在可用内存的面积,直到两个边界相等为止(见清单) void enforceMemoryLeakage(void**arrayOfAllocMemory) { 无符号整数maxMemory=0x8000000; 无符号整数最小内存=0x50000000; unsigned int attemplocatedmemory=minMemory+(maxMemory-minMemory)/2; 空虚的记忆; 而((最大

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

void enforceMemoryLeakage(void**arrayOfAllocMemory)
{
无符号整数maxMemory=0x8000000;
无符号整数最小内存=0x50000000;
unsigned int attemplocatedmemory=minMemory+(maxMemory-minMemory)/2;
空虚的记忆;
而((最大内存-最小内存)>1)
{
pAllocMemory=malloc(attempAllocatedMemory);
if(pAllocMemory!=NULL)
{
minMemory=attemplocatedmemory;
attemplocatedmemory+=(maxMemory-minMemory)/2;
自由(帕洛克记忆);
}
其他的
{
maxMemory=AttemplocatedMemory;
attemplocatedmemory=minMemory+(maxMemory-minMemory)/2;
}
}
arrayOfAllocMemory[0]=malloc(maxMemory);
void*pAllocAdditionalMemory=malloc(100);
if(pAllocAdditionalMemory==NULL)

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

假设您的二进制搜索代码中没有bug…我打赌您将面临内存碎片问题,因为您在执行过程中成功分配/释放内存,其他进程也可以这样做,因此您可能会碎片化内存。示例:

  • 操作系统有2M字节的连续可用内存块
  • 分配1.5兆字节的内存(
    0.5兆字节
    free)
  • 其他一些进程分配1kbyte(
    0.499mbyte
    free)
  • 释放1兆字节(
    1.0+0.499兆字节
    释放两个片段)
  • 并尝试分配1.25兆字节 但是操作系统在单个连续块中没有1.25内存,所以它失败了,因此您需要再次分配1兆字节(
    0.499兆字节
    free)
  • 您成功地分配了1kbyte(
    0.498mbyte
    free)
  • 根据操作系统的内存管理策略,有时甚至不需要另一个进程来分割内存


    然而,还有另一种与碎片无关的可能性。在模拟或WOW64的情况下,操作系统将不会分配整个可用RAM,并且对单个连续块大小也有限制。例如,Win32将不允许超过~1.25 GB,但这并不意味着只有1.25 GB的可用RAM…

    I'm r非常感谢您的详细回答。为了完整起见,我想提及我正在开发一个Windows x86应用程序。我最初的意图是强制执行以下测试所需的内存泄漏。但是,只有在没有更多可用内存的情况下,此测试才会成功。是否有其他简单的方法强制执行内存泄漏通过malloc命令请求额外字节并返回空指针,从而导致内存泄漏?@RatbaldMeyer内存泄漏正在重复(在循环/事件/线程中)of:分配内存而不释放内存,这会随着时间的推移而减少可用内存,直到没有剩余可用RAM…因此,只需在某个线程循环中分配100字节,并使用一些睡眠或计时器,这将随着时间的推移而稳定地减少可用内存…顺便说一句,在Windows上有:但很难说在WOW64的情况下它是如何工作的(64位操作系统上的32位应用程序)