Malloc分配的内存多于RAM

raj*_*raj 6 c c++ malloc memory-management

我刚刚在一台12 MB的机器上执行了一个mallocs 13 MB的程序(QEMU Emulated!).不仅如此,我甚至浏览了记忆并填充了垃圾......

void 
large_mem(void) 
{
  #define LONGMEM  13631488
  long long *ptr = (long long *)malloc(LONGMEM);
  long long i;
  if(!ptr) {
     printf("%s(): array allocation of size %lld failed.\n",__func__,LONGMEM);
     ASSERT(0);
  }
  for(i = 0 ; i < LONGMEM ; i++ ) { 
    *(ptr+i)=i;
  }
  free(ptr);
}
Run Code Online (Sandbox Code Playgroud)

这怎么可能 ?我期待一个分段错误.

Naw*_*waz 10

它被称为为您的程序分配的虚拟内存.它不是你称之为RAM的真实内存.

虚拟内存也有最大限制,但它高于RAM.它由您的操作系统实现(和定义).

  • @raj:理论上的限制取决于指针的大小.实际上,大多数操作系统会比指针大小产生的任何地址空间给你更少的内存.并且,是的,如果您分配的内存多于机器中实际存在的内存,您将进行交换. (3认同)

Alo*_*ave 7

这称为惰性分配.

大多数类似Linux的操作系统都有一个Lazy Allocation内存模型,其中返回的内存地址是一个虚拟地址,实际的分配只在访问时发生.操作系统假定它能够在访问时提供此分配.

在程序实际触摸之前,malloc分配的内存不受实际内存的支持.

同时,由于calloc将内存初始化为0,因此可以确保操作系统已经使用实际RAM(或交换)支持分配.

尝试使用,calloc并且很可能它会让你内存不足,除非你的交换文件/分区足够大以满足请求.


In *_*ico 5

听起来您的操作系统正在交换页面

分页是大多数当代通用操作系统中虚拟内存实现的重要组成部分,允许它们使用磁盘存储来存储不适合物理随机存取内存 (RAM) 的数据。

换句话说,操作系统正在使用您的一些硬盘空间来满足您的 13 MB 分配请求(以极大的速度为代价,因为硬盘比 RAM得多)。