【发布时间】:2020-04-09 00:58:05
【问题描述】:
我使用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(即
代码 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;
}
我的猜测是,这是由于内存碎片造成的,但我不确定。谁能解释一下正确的原因。
【问题讨论】:
-
std::vector是你的朋友。malloc和new不是你的朋友。 -
你应该检查
malloc的返回值。 -
@DeepakTatyajiAhire 你在构建这个优化了吗?因为编译器可以很容易地看到循环在第一个程序中什么都不做,只是消除它(以及程序的其余部分):godbolt.org/z/7q3ofp。但在第二个程序中,这并不容易,因为它必须实际输出其中一个值。
-
在您的“代码 1”中,编译器可能会完全优化掉
for循环,因为它不会做任何有任何进一步明显影响的事情。 -
@DeepakTatyajiAhire 您没有检查
malloc是否返回NULL。因此,在调用malloc后无法确定发布程序的行为。
标签: c++ memory-management