c++ - 为什么在重新分配小块内存时分配大块内存失败

标签 c++ linux malloc

此代码导致 x 指向一 block 大小为 100GB 的内存。

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

int main() {
    auto x = malloc(1);
    for (int i = 1; i< 1024; ++i) x = realloc(x, i*1024ULL*1024*100);
    while (true); // Give us time to check top
}

虽然这段代码分配失败。

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

int main() {
    auto x = malloc(1024ULL*1024*100*1024);
    printf("%llu\n", x);
    while (true); // Give us time to check top
}

最佳答案

我的猜测是,您系统的内存大小小于您尝试分配的 100 GiB。虽然 Linux 确实会过度使用内存,但它仍然会摆脱超出其能力范围的请求。这就是第二个示例失败的原因。

另一方面,第一个示例的许多小增量远低于该阈值。因此,它们中的每一个都成功了,因为内核知道您还不需要任何先前的内存,因此它没有迹象表明它无法支持这 100 个额外的 MiB。

我认为进程内存请求失败的阈值与可用 RAM 相关,并且可以调整(虽然我不记得具体是多少)。

关于c++ - 为什么在重新分配小块内存时分配大块内存失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29452164/

相关文章:

c++ - 如何使 QtCreator 使用 gsl 库进行编译?

c - 当作为后台进程运行时,防止 read() 系统调用返回 0

c - 绑定(bind)生命周期如何可以比对象生命周期长?

c - 我如何在不使用 stdlib.h 的情况下执行此代码

c++ - 在 C++ 中检查空静态映射变量

c++ - C++中一些无法解释的错误

Java JSch 在远程机器上更改用户并执行命令

c++ - 如果函数提前返回或抛出异常,是否会调用对象的析构函数?

c++ - 将指针作为参数传递给 void* 参数时转换指针

c - 为什么在 C 中为数组声明动态分配的内存和指向数组声明的指针不一样?