Заметки / Переполнение стека

C++
 В создании массивов на C++ есть свои особенности. Пример массива:
#include <windows.h>

int main (int argc, char *argv[])
{
 char Array [100000] [10];

 system ("pause");
}

- успешно выполнится и займёт мегабайт памяти:


Если же размер массива увеличить всего-лишь вдесятеро:
#include <windows.h>

int main (int argc, char *argv[])
{
 char Array [100000] [100];

 system ("pause");
}

- произойдёт ошибка:


Такой массив лучше объявить глобально:
#include <windows.h>

char Array [100000] [100];

int main (int argc, char *argv[])
{
 system ("pause");
}

При этом память под него будет отведена, но не занята:


Большие массивы, без риска переполнения стека, можно создавать также следующим образом:
#include <windows.h>

int main (int argc, char *argv[])
{
 char **Array;

 Array=new char * [100000];

 for (int i=0; i<100000; i++)
  Array [i]=new char [100];

 system ("pause");

 // Удаление массива
 for (int i=0; i<100000; i++)
  delete [] Array [i];

 delete [] Array;
}

- при этом массив сразу займёт необходимую ему память:


После работы с данным массивом его можно удалить, чтобы освободить выделенную память. При выходе из программы память очистится сама. Размер исполняемого файла при этом способе создания массива немного увеличится.

Переполнение стека также может случиться при большом количестве рекурсивных вызовов функции.

28.09.2017