为什么我们可以分配一个1 PB(10 ^ 15)的数组并访问最后一个元素,但是不能释放它呢?

亚历克斯:

众所周知: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

  • 1000 ^ 5 PB PB
  • 1024 ^ 5 PiB PB- 我用它

因此,实际上,如果我们想分配更多的内存+交换空间并解决overcommit_memory限制,则可以VirtualAllocEx()在Windows或mmap()Linux上使用来分配内存,例如:

赞·山猫(Zan Lynx):

我相信您的问题是那malloc()不以a long long int为理由。需要一个size_t

更改代码以将其定义petabytesize_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] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

当我们有一个红色区域时,为什么我们需要堆栈分配?

来自分类Dev

C# - 为什么我们可以继承一个接口两次?

来自分类Dev

为什么我们不能声明一个映射并在const之后填充它?

来自分类Dev

为什么我们不能给一个字符串分配一个字符,却可以分配多个字符?

来自分类Dev

我们可以使用数组的最后一个元素吗?

来自分类Dev

如果我们只能分配一个公共IP地址,为什么还要有NAT?

来自分类Dev

为什么我们需要一个“MultiRepositoryProvider”和一个单独的“MultiBlocProvider”?

来自分类Dev

为什么我们在html中使用id。我认为我们可以将一个类用作id

来自分类Dev

当我们在一个接口中添加两个抽象方法并只实现一个方法时,为什么我们不能使用 lambda 实现另一个方法呢?

来自分类Dev

为什么我们要指定一个委托和一个事件,为什么不只在C#中使用一个事件呢?

来自分类Dev

为什么我们不能声明一个类型为void的变量?

来自分类Dev

为什么我们不能扩展一个以上的班级

来自分类Dev

为什么我们可以非常量引用一个临时对象并延长其寿命?

来自分类Dev

为什么在关闭系统时我们可以杀死另一个用户的进程

来自分类Dev

当我们为一个类的对象分配一个整数值时,为什么要调用参数化构造函数?

来自分类Dev

我们必须分配一个结构吗?

来自分类Dev

为什么我们需要两个接口来枚举一个集合?

来自分类Javascript

为什么我们不能将document.querySelector方法分配给另一个变量并使用它?

来自分类Dev

为什么在Windows 10中我可以将标签添加到一个JPG文件中,而不能添加另一个标签?

来自分类Dev

当我们给一个名字分配一个函数时,内部会发生什么?

来自分类Java

为什么对于equals方法我们需要一个Object参数?

来自分类Dev

为什么我们必须从一个小部件更新多个小部件?

来自分类Dev

为什么我们需要在React Hook中返回一个函数?

来自分类Dev

Java LRUCache,为什么我们需要另一个集合

来自分类Java

为什么说我们不需要克隆一个不可变类?

来自分类Dev

LinkedList 删除:为什么我们不使用前一个覆盖头部?

来自分类Dev

为什么我们需要一个NAT实例?

来自分类Dev

为什么我们需要另一个模式来进行模式缝合?

来自分类Java

ExecutorCompletionService?如果我们有invokeAll,为什么需要一个?

Related 相关文章

  1. 1

    当我们有一个红色区域时,为什么我们需要堆栈分配?

  2. 2

    C# - 为什么我们可以继承一个接口两次?

  3. 3

    为什么我们不能声明一个映射并在const之后填充它?

  4. 4

    为什么我们不能给一个字符串分配一个字符,却可以分配多个字符?

  5. 5

    我们可以使用数组的最后一个元素吗?

  6. 6

    如果我们只能分配一个公共IP地址,为什么还要有NAT?

  7. 7

    为什么我们需要一个“MultiRepositoryProvider”和一个单独的“MultiBlocProvider”?

  8. 8

    为什么我们在html中使用id。我认为我们可以将一个类用作id

  9. 9

    当我们在一个接口中添加两个抽象方法并只实现一个方法时,为什么我们不能使用 lambda 实现另一个方法呢?

  10. 10

    为什么我们要指定一个委托和一个事件,为什么不只在C#中使用一个事件呢?

  11. 11

    为什么我们不能声明一个类型为void的变量?

  12. 12

    为什么我们不能扩展一个以上的班级

  13. 13

    为什么我们可以非常量引用一个临时对象并延长其寿命?

  14. 14

    为什么在关闭系统时我们可以杀死另一个用户的进程

  15. 15

    当我们为一个类的对象分配一个整数值时,为什么要调用参数化构造函数?

  16. 16

    我们必须分配一个结构吗?

  17. 17

    为什么我们需要两个接口来枚举一个集合?

  18. 18

    为什么我们不能将document.querySelector方法分配给另一个变量并使用它?

  19. 19

    为什么在Windows 10中我可以将标签添加到一个JPG文件中,而不能添加另一个标签?

  20. 20

    当我们给一个名字分配一个函数时,内部会发生什么?

  21. 21

    为什么对于equals方法我们需要一个Object参数?

  22. 22

    为什么我们必须从一个小部件更新多个小部件?

  23. 23

    为什么我们需要在React Hook中返回一个函数?

  24. 24

    Java LRUCache,为什么我们需要另一个集合

  25. 25

    为什么说我们不需要克隆一个不可变类?

  26. 26

    LinkedList 删除:为什么我们不使用前一个覆盖头部?

  27. 27

    为什么我们需要一个NAT实例?

  28. 28

    为什么我们需要另一个模式来进行模式缝合?

  29. 29

    ExecutorCompletionService?如果我们有invokeAll,为什么需要一个?

热门标签

归档