首页 > 解决方案 > MacOS Monterey 中的堆内存分配

问题描述

我刚刚升级到 MacOS Monterey,我看到在堆上分配内存(malloc/new)时返回的地址有一些不寻常的行为。似乎如果你要求超过 256 个字节,你会得到一个略高于 PAGE_ZERO (0x100000000) 的地址,但如果你要求 256 个字节或更少,你会得到一个高于 0x600000000000 的地址。

我知道 c 库在堆上分配时可以自由地返回它喜欢的任何地址,这对您的代码无关紧要。但是我的代码依赖于位于同一内存区域中的堆地址。我知道这是不好的编程,但这是有原因的。

有没有办法让蒙特雷在同一内存区域分配内存(除了总是分配超过 256 个字节)?谢谢你的任何想法。

示例代码:

#include <stdio.h>
#include <stdlib.h>

int main(int argc, char *argv[])
{
    size_t i,count = 2;
    for (i = 0; i < 16; i++)
    {
        void *ptr = malloc(count);
        printf("malloc(%d) returned %p\n",count,ptr);
        count *= 2;
    }
    for (count = 250; count < 260; count++)
    {
        void *ptr = malloc(count);
        printf("malloc(%d) returned %p\n",count,ptr);
    }
    return 0;
}

标签: c++mallocheap-memorymacos-monterey

解决方案


推荐阅读