2013-06-26 50 views
9

我有一个涉及内存分配的问题。比方说,我创建了一个像这样的指针数组。指针数组的C++内存分配

int **numbers = new int *[1024*1024]; 

我以为这需要8MB内存(Mac 64位上的8字节指针),但情况并非如此。内存只在每个指针分配一个值时分配。所以,如果我NULL所有的指针,然后我看到8MB被分配。

for(int i=0; i<1024*1024; i++) 
{ 
    numbers[i] = NULL; 
} 

我的应用程序如何知道哪些指针为其分配了一个值而不为其分配内存?

+9

'new'可能只是保留地址空间,并且只有在写入内存后才提交内存。这是一种常见的优化,由操作系统执行。 – Mankarse

+0

只是为了增加混淆,如果您要读取而不是写入所有指针,它们都将为NULL,但在这种情况下,您的内存不会增加,因为您只需读取零页并重新开始。 – Neil

回答

5

您正在观察操作系统的一个功能,称为overcommit-accounting

默认情况下,未分配的内存仅获取保留的地址空间(进程特定的虚拟内存)。只有在为其分配值时,页面才会真正映射到页面表中的物理地址。

2

我的猜测是内存分配,但没有显示在ps/top结果[不知道在mac中的哪个工具],因为页面没有被触及。 chk所有内存相关的列

12

从C++的角度来看你的内存已经分配了。您最好不要通过操作系统报告的方式来混淆自己。

你的“app”肯定不知道它是否指定了一个指针 - 只是你作为程序员负责在赋值之前不使用任何指针。

如果对可能的背景感兴趣,请看看这里或其他文章中的memory overcommit