我有一个涉及内存分配的问题。假设我创建了一个像这样的指针数组。
int **numbers = new int *[1024*1024];
我原以为这需要8MB内存(Mac 64位上的8字节指针),但事实并非如此。仅在为每个指针分配值时分配内存。因此,如果我将所有指针都置空,那么我会看到8MB被分配。
for(int i=0; i<1024*1024; i++)
{
numbers[i] = NULL;
}
我的应用程序如何知道哪些指针在没有为其分配内存的情况下分配了值?
答案 0 :(得分:12)
从C ++的角度来看,你的内存是分配的。最好不要通过操作系统报告来混淆自己。
你的“app”肯定不知道它是否分配了一个指针 - 只是你作为程序员有责任在分配之前不使用任何指针。
如果对可能的背景信息感到好奇,请在此处或其他文章中查看memory overcommit。
答案 1 :(得分:5)
您正在观察操作系统的一项功能,称为overcommit-accounting。
默认情况下,未分配的内存仅获取保留的地址空间(特定于进程的虚拟内存)。只有在为其分配值时,页面才会实际映射到页表中的物理地址。
答案 2 :(得分:2)
我的猜测是内存已分配,但未显示在ps / top结果中[不确定mac中的哪个工具]因为页面未被触及。 chk所有与内存相关的列