【发布时间】:2015-03-07 21:34:43
【问题描述】:
在 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*));
}
}
然后我访问这个数据结构以向其中添加一个元素,如下所示:
Node* elem = NULL;
Matrix[a][b].length++;
Matrix[a][b]->pointers[ Matrix[a][b].length ] = elem;
基本上,我在运行程序时使用 htop,如果我增加编号,Linux 确实会分配更多内存。 “60”我在上面的代码中。为什么?当第一个元素添加到数组时,它不应该只分配一个页面吗?
【问题讨论】:
-
First -> Do not cast the return value of
malloc(),你有没有问过自己 top 如何确定进程的内存使用量? -
我不确定你的问题;
malloc经常使用mmap获取内存,但通常不会将其(通过munmap)返回到free的内核(但管理释放的内存以供未来malloc-s 重用) -
@a3mlord 您正在使用 c++ 编译器,因为如果 c 编译器给出该错误,则意味着它不是标准编译器,请确保您的项目构建的是正确的编译器。
-
您没有检查 malloc 的返回值。根据您的系统设置,很有可能当您尝试分配过多内存时,malloc 将开始返回 NULL。然后,当您尝试通过该变量设置某些内容时,它将导致段错误。由于上面的代码,你的进程映射的虚拟内存量会增加,即使你不去碰它。
-
这并不重要,因为您正在更改该程序运行的参数(即 - 它尝试分配多少内存)。如果 malloc 返回 NULL,那么上面的代码会尝试取消引用它,这几乎肯定会导致 seg 错误。
标签: c++ linux memory dynamic-memory-allocation