众所周知:http : //linux.die.net/man/3/malloc
默认情况下,Linux遵循乐观的内存分配策略。这意味着当malloc()返回非NULL时,不能保证内存确实可用。万一发现系统内存不足,OOM杀手将杀死一个或多个进程。
而且,我们可以使用以下方法成功分配1 PB的VMA(虚拟内存区域)malloc(petabyte);
:http : //ideone.com/1yskmB
#include <stdio.h>
#include <stdlib.h>
int main(void) {
long long int petabyte = 1024LL * 1024LL * 1024LL * 1024LL * 1024LL; // 2^50
printf("petabyte %lld \n", petabyte);
volatile char *ptr = (volatile char *)malloc(petabyte);
printf("malloc() - success, ptr = %p \n", ptr);
ptr[petabyte - 1LL] = 10;
printf("ptr[petabyte - 1] = 10; - success \n");
printf("ptr[petabyte - 1] = %d \n", (int)(ptr[petabyte - 1LL]));
free((void*)ptr); // why the error is here?
//printf("free() - success \n");
return 0;
}
结果:
Error time: 0 memory: 2292 signal:6
petabyte 1125899906842624
malloc() - success, ptr = 0x823e008
ptr[petabyte - 1] = 10; - success
ptr[petabyte - 1] = 10
而且我们可以成功访问(存储/加载)PB的最后一个成员,但是为什么会出现错误free((void*)ptr);
?
注意:https://en.wikipedia.org/wiki/Petabyte
因此,实际上,如果我们想分配更多的内存+交换空间并解决overcommit_memory
限制,则可以VirtualAllocEx()
在Windows或mmap()
Linux上使用来分配内存,例如:
mmap()
与标志MAP_NORESERVE | MAP_PRIVATE | MAP_ANONYMOUS
和一起使用fd=-1
:http : //coliru.stacked-crooked.com/a/c69ce8ad7fbe4560我相信您的问题是那malloc()
不以a long long int
为理由。需要一个size_t
。
更改代码以将其定义petabyte
为size_t
程序后,不再从malloc返回指针。相反,它失败了。
我认为您的数组访问权限设置petabyte-1为10正在写入,远远超出返回的malloc数组。那就是崩溃。
调用函数时,请始终使用正确的数据类型。
使用以下代码查看发生了什么:
long long int petabyte = 1024LL * 1024LL * 1024LL * 1024LL * 1024LL;
size_t ptest = petabyte;
printf("petabyte %lld %lu\n", petabyte, ptest);
如果以64位模式进行编译,则无法分配1 PB的数据。如果我以32位模式进行编译,则它成功分配了0个字节,然后尝试在其数组之外写入并出现段错误。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句