Я использовал функцию 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;
}

Я думаю, это происходит из-за фрагментации памяти, но я не уверен в этом. Может ли кто-нибудь любезно объяснить правильную причину.

-1
Deepak Tatyaji Ahire 16 Дек 2019 в 17:32

2 ответа

Лучший ответ

Это определенно

  1. Оптимизация компилятора

  2. Ограничение на выделение памяти согласно стандартной песочнице

2
MC_user 16 Дек 2019 в 15:08

Современные операционные системы делают то, что называется «ленивое распределение», это означает, что когда вы просите выделить память, они отдают ее вам, фактически не выделяя память.

Именно поэтому виртуальная память и физическая память используются во время использования top.

Память действительно выделяется только при попытке использовать сам буфер.

В вашем примере вы выделили много памяти (4 ГБ), ОС позволила вам выделить ее, но фактически не освободила необходимую для нее память, после того, как вы попытались ее использовать, она попыталась фактически предоставить вам просил, не мог этого сделать и поэтому разбился.

1
gkpln3 16 Дек 2019 в 14:40