Linux确实在C++代码中分配内存

a3m*_*ord 2 c++ linux memory dynamic-memory-allocation

在Linux中,内核在我们实际使用该内存之前不会分配任何物理内存页面,但我在这里很难找到它为什么实际上分配这个内存:

   for(int t = 0; t < T; t++){
      for(int b = 0; b < B; b++){
         Matrix[t][b].length = 0;
         Matrix[t][b].size = 60;
         Matrix[t][b].pointers = (Node**)malloc(60*sizeof(Node*)); 
         }
   }
Run Code Online (Sandbox Code Playgroud)

然后我访问这个数据结构,为它添加一个元素,如下所示:

   Node* elem = NULL;
   Matrix[a][b].length++;
   Matrix[a][b]->pointers[ Matrix[a][b].length ] = elem;
Run Code Online (Sandbox Code Playgroud)

基本上,我用htop运行我的程序,如果增加no,Linux会分配更多的内存.我在上面的代码中有"60".为什么?它不应该只在第一个元素添加到数组时分配一个页面吗?

jsc*_*410 7

这取决于Linux系统的配置方式.

这是一个简单的C程序,试图分配1TB的内存并触及其中的一部分.

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

int main()
{
  char *array[1000];
  int i;

  for (i = 0; i < 1000; ++i)
  {
    if (NULL == (array[i] = malloc((int) 1e9)))
    {
      perror("malloc failed!");
      return -1;
    }

    array[i][0] = 'H';
  }

  for (i = 0; i < 1000; ++i)
    printf("%c", array[i][0]);

  printf("\n");

  sleep(10);

  return 0;
}
Run Code Online (Sandbox Code Playgroud)

当我在它旁边运行顶部时,它表示VIRT内存使用量达到931g(其中g表示GiB),而RES仅达到4380 KiB.

现在,当我改变我的系统以使用不同的过度使用策略/sbin/sysctl -w vm.overcommit_memory=2并重新运行它时,我得到:

malloc failed!: Cannot allocate memory
Run Code Online (Sandbox Code Playgroud)

因此,您的系统可能正在使用与您预期不同的过度使用策略.欲了解更多信息,请阅读.