Ошибка превышения лимита памяти

Опубликовано: 13 Сентября, 2022

Ошибка превышения лимита памяти : Обычно это происходит, когда не установлен лимит памяти. Это означает, что программа пытается выделить больше памяти, чем лимит памяти для конкретной задачи. Например, если предел памяти составляет 256 МБ , то нет необходимости писать код, требующий более 256 МБ памяти. Как правило, все онлайн-платформы имеют одинаковый лимит памяти в 256 МБ . Может быть еще много причин, из-за которых может возникнуть эта ошибка.

Программа 1:

Ниже приведена программа C++ для объявления глобального одномерного массива размером 10 7 :

Объяснение: Этот код будет успешно скомпилирован и выведет 9999999 , поскольку глобально объявлен одномерный массив размером 10 7 .

Программа 2: Ниже приведена программа на C++ для объявления глобального одномерного массива размером 10 8 :

C++




// C++ code declaring a global 1-D
// array of size 10^8
#include <bits/stdc++.h>
using namespace std;
 
// Variable N is initialized
const int N = 1e8;
 
// Global array is declared
int a[N];
 
// Driver Code
int main()
{
    for (int i = 0; i < N; ++i) {
        a[i] = i;
    }
    cout << a[N - 1];
    return 0;
}

Выход:

Memory Limit Exceeded

или же

Segmentation Fault (SIGSEGV)

Объяснение: в приведенной выше программе пользователи получат ограничение памяти и превышение в виде ошибки, но некоторые онлайн-платформы также могут выдавать ошибку в виде ошибки сегментации ( SIGSEGV ). Это связано с тем, что пользователи могут объявить глобальный одномерный массив только размером 10 7 , не более того. Здесь один объявил глобальный одномерный массив размером 10 8 и, следовательно, имеет место ошибка, поскольку происходит превышение предела памяти (MLE).

Примечание:

  • Обратите внимание, что попытка превысить лимит памяти может иногда приводить к другим ошибкам.
  • Например, если пользователи используют malloc в C для выделения памяти. Если malloc терпит неудачу из-за того, что пользователь пытается выделить слишком много, он просто возвращает нулевой указатель, который, если его не проверить, вероятно, вызовет ошибку времени выполнения, когда пользователь попытается его использовать.
  • Точно так же попытка выделить слишком много памяти в C++ с помощью new вызовет SIGABRT и выдаст ошибку времени выполнения.

C++