最大的malloc大小比预期的要小

问题描述 投票:1回答:1

这是一个检查最大malloc大小的简单程序:

#include <iostream>

std::size_t maxDataSize = 2097152000; //2000mb

void MallocTest(void*& ptr)
{
    while (1)
    {
        ptr = malloc(maxDataSize);

        if (ptr)
        {
            std::cout << "Malloc success: " << maxDataSize << std::endl;
            return;
        }

        maxDataSize -= 1024;

        if (maxDataSize <= 0)
        {
            return;
        }           
    }
}

int main()
{
    void* ptr = nullptr;
    MallocTest(ptr);
    if (ptr)
    {
        free(ptr);
    }
    system("pause");
    return EXIT_SUCCESS;
}

当我运行该程序时,我成功获得了〜1300mb的malloc调用。该程序使用32位体系结构(释放模式)构建,因此理论上内存限制等于2GB。有什么引起内存碎片的吗?为什么我不能分配超过1300mb的空间?

c++ memory-management
1个回答
1
投票

您没有说您使用的是什么操作系统,但是它是32位的。实际上,[[good 32位实现将有2 GB的硬限制,因为大于PTRDIFF_MAX的对象存在许多细微的问题,在使用它们时都容易引起未定义的行为,并触发处理指针的编译器错误算术。但是,您遇到了一些下限限制因素。

[在Linux上,当32位进程在64位内核上运行时,大多数拱门的32位进程的虚拟地址空间限制为3 GB,某些拱门为2 GB,某些拱门为4 GB。但是,在此空间中,已经映射了许多地址空间的内容,并限制了任何连续范围的长度。这包括程序本身,以及如果它是动态链接的,动态链接程序以及它使用的任何共享库。
© www.soinside.com 2019 - 2024. All rights reserved.