Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/61.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 为什么不是';t malloc是否正在填充内存?_C++_C_Linux - Fatal编程技术网

C++ 为什么不是';t malloc是否正在填充内存?

C++ 为什么不是';t malloc是否正在填充内存?,c++,c,linux,C++,C,Linux,我有以下代码: #include <iostream> #include <stdlib.h> #include <stdio.h> int main() { int data = 0; char *byte = (char *)malloc(sizeof(char)*1000000000); byte[999999999] = 'a'; printf("%c",byte[999999999]); scanf("%d",&da

我有以下代码:

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

int main() {
    int data = 0;
    char *byte = (char *)malloc(sizeof(char)*1000000000);
byte[999999999] = 'a';
printf("%c",byte[999999999]);
    scanf("%d",&data);
    return 0;
}

程序输出
a

malloc
在您请求时,没有给您所有
100000000
。这只是你得到的第一页,直到你开始访问它(读/写),你会得到它的剩余部分

Linux,
malloc
请求将立即扩展虚拟地址空间,但在您访问它之前不会分配物理内存页

大多数(所有?)Linux系统过度占用内存。这意味着malloc永远不会失败,即使在使用特定的提交策略时保留了大量的内存。在某些情况下,如果您保留的内存太多,例如超过虚拟内存,它可能会失败

你没有得到真正的内存地址,只有一个指针,它被承诺指向足够的内存供你使用。如果您试图使用内存,系统会为您分配内存,因此您必须向它写入数据,以向系统发出您确实需要它的信号

使用该系统是因为许多程序不需要它们保留的内存或在其他时间需要它


编辑后,您只能访问一页,因此只能保留一页。您需要访问每个页面才能获得所有内存。

默认情况下,Linux在第一次访问物理内存时会延迟分配物理内存。您对
malloc
的调用将分配一大块虚拟内存,但尚未有任何物理内存页映射到它。第一次访问未映射的页面将导致错误,内核将通过分配和映射一个或多个物理内存页面来处理该错误

要分配所有物理内存,您必须在每个页面上访问至少一个字节;或者您可以绕过
malloc
,直接使用类似于

mmap(0, 1000000000, PROT_NONE, MAP_PRIVATE | MAP_ANONYMOUS | MAP_POPULATE, -1, 0);

注意使用
MAP\u POPULATE
来填充页面表,即立即分配物理内存。根据手册页,这只适用于较新版本的Linux。

您的操作系统可能会过度占用内存。试着对分配的块进行写入,有可能会失败。请,请不要把C和C++混合得这么糟糕,而且!HAL9000需要C++中的强制转换。您通常不会在C中使用它。顺便说一句,
sizeof(char)
在C中总是1。@HAL9000这是正确的。这就是为什么在C++中不使用<代码> MalCube()/<代码>的原因。(还有其他的原因)你所拥有的代码不是C++,而是C,所以没有理由尝试用C++编译器编译它。他们是不同的语言。您不经常尝试在JavaScript解释器中运行Python代码,是吗?@HAL9000如果您是一名初学者,并且向有经验的人寻求帮助,那么愿意学习通常是一个好主意。例如,在本例中,确定您正在编写什么(C或C++),然后遵循适当的实践,然后使用适当的编译器进行构建。您确定吗<代码>malloc永不失败?如果它不能保证给你记忆,我想它确实失败了。它还必须保留内存,如果它只承诺将超过50%的内存分配给两个进程,但这两个进程都实际使用了内存,会发生什么?操作系统,不会在调用malloc时“占用”物理内存。但它可能会失败,而且偶尔会失败。在那些系统上,它从来不会失败。如果没有足够的内存,系统将开始终止其他进程以释放内存。(OOM Killer)显然这取决于您的配置,例如,在windows上,如果无法保证内存,它将失败。它认为当您分配并提交系统上的整个虚拟内存时,然后调用
malloc
它将失败。那是假的吗?我很好奇,没有任何机器可以在我的手下“打破”。如果你能马上知道答案,我将不胜感激,因为我看到
malloc
s失败了,可能是太久以前的事了。让我们假设
malloc
循环中的某个东西并写入它。它总是会通过,系统将开始终止进程,或者
malloc
将开始返回
0
?我想,当
malloc
实际返回
0
时,我只见过一次。这是一个执行类似循环的bug。我完全同意让它失败是非常困难的,这是一个极端的边缘案例。但这是可能的。不过,我觉得这要容易一点。我认为在linux上尝试保留超过整个虚拟内存也会失败。我刚刚让malloc(24ull*1024ull*1024ull*1024ull*1024ull)在我的系统上返回一个空指针(16GiB ram,16GiB交换),这与我在理论上所研究的内容非常清楚和一致,谢谢;之后,malloc会像你说的那样将内存分配给物理内存。
mmap(0, 1000000000, PROT_NONE, MAP_PRIVATE | MAP_ANONYMOUS | MAP_POPULATE, -1, 0);