C++内存分配:指针数组

9

我有一个与内存分配相关的问题。假设我创建了一个指针数组,就像这样。

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
只是为了增加混淆,如果你读取而不是写入所有指针,它们都将为NULL,但在这种情况下,你的内存不会增加,因为你只是一遍又一遍地读取零页。 - Neil
3个回答

12

从C++角度看,你的内存已经被分配好了,不要被操作系统报告的东西所困扰。

你的“应用程序”绝对不知道它是否分配了指针 - 只有你作为程序员负责在分配指针之前不使用任何指针。

如果想了解可能的背景,请查看内存过度提交,例如在这里或其他文章中。


5
你正在观察操作系统的一个特性,称为过度承诺会计
默认情况下,未分配的内存只会被保留地址空间(进程特定的虚拟内存)。只有在给它赋值时,页面才实际映射到页表中的物理地址。

2

我的猜测是内存已经被分配,但由于页面没有被访问,所以在ps/top结果中[不确定在Mac中使用哪个工具]没有显示。请检查所有与内存相关的列。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接