【问题标题】:Segmentation fault while accessing particular array location/index访问特定数组位置/索引时出现分段错误
【发布时间】: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 是你的朋友。 mallocnew 不是你的朋友。
  • 你应该检查malloc的返回值。
  • @DeepakTatyajiAhire 你在构建这个优化了吗?因为编译器可以很容易地看到循环在第一个程序中什么都不做,只是消除它(以及程序的其余部分):godbolt.org/z/7q3ofp。但在第二个程序中,这并不容易,因为它必须实际输出其中一个值。
  • 在您的“代码 1”中,编译器可能会完全优化掉 for 循环,因为它不会做任何有任何进一步明显影响的事情。
  • @DeepakTatyajiAhire 您没有检查malloc 是否返回NULL。因此,在调用malloc 后无法确定发布程序的行为。

标签: c++ memory-management


【解决方案1】:

一定是的

  1. 编译器优化

  2. 根据标准沙盒限制内存分配

【讨论】:

    【解决方案2】:

    现代操作系统正在做一种称为“惰性分配”的事情,这意味着当您要求分配内存时,它们会在没有实际分配内存的情况下将其提供给您。

    这正是您在使用 top 时看到的虚拟内存与物理内存占用的原因。

    只有当您尝试使用缓冲区本身时,才会真正分配内存。

    在您的示例中,您分配了很多内存 (4GB),操作系统允许您分配它,但实际上并没有释放它所需的内存,一旦您尝试使用它,它就会尝试实际提供你要求的内存,做不到,因此崩溃了。

    【讨论】:

      猜你喜欢
      • 2011-05-20
      • 2017-02-19
      • 1970-01-01
      • 1970-01-01
      • 2022-10-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-10-04
      相关资源
      最近更新 更多