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

C++ memory allocation for an array of pointers

本文关键字:内存 分配 C++ 数组 指针      更新时间:2023-10-16

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

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

我曾认为这需要8MB的内存(Mac 64位上的8字节指针),但事实并非如此。只有当每个指针都分配了一个值时,才会分配内存。因此,如果我将所有指针归空,那么我会看到8MB被分配。

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

我的应用程序如何在不分配内存的情况下知道哪些指针被分配了值?

从C++的角度来看,您的内存已经分配好了。您最好不要被操作系统报告的内容弄糊涂。

你的"应用程序"肯定不知道它是否分配了指针——只有你作为程序员有责任在分配之前不使用任何指针。

如果对可能的背景感到好奇,可以四处寻找像这里或其他文章中那样的内存过度投入。

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

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

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