[我使用malloc
函数将10 ^ 9个存储位置分配为数组的一部分。
代码1成功执行。
代码1:
int main(){
int size = (int)(1e9);
int* arr = (int*) malloc( size * sizeof(int) );
for(int i=0;i<size;i++){
arr[i] = i;
}
return 0;
}
但是当我尝试访问特定的内存位置或索引值= 12345678(即<1e9)时,出现了分段错误
代码2:
int main(){
int size = (int)(1e9);
int* arr = (int*) malloc( size * sizeof(int) );
for(int i=0;i<size;i++){
arr[i] = i;
}
cout<<arr[12345678]<<endl; //added this line of code, which gives segmentation fault
return 0;
}
我的猜测是,这是由于内存碎片而引起的,但是对此我不确定。谁能解释正确的原因。
绝对是
编译器优化
限制每个标准沙箱的内存分配
现代操作系统正在执行一种称为“惰性分配”的操作,这意味着当您要求分配内存时,它们会在没有实际分配内存的情况下将其分配给您。
这正是使用top
时看到的虚拟内存与物理内存占用的原因。
仅当您尝试使用缓冲区本身时才真正分配内存。
在您的示例中,您分配了很多内存(4GB),操作系统允许您分配它,但实际上并没有释放它所需的内存,一旦尝试使用它,它将尝试实际提供您要求的内存无法执行,因此崩溃了。