Следующий код дает мне ошибку сегментации при запуске на машине 2 ГБ, но работает на машине 4 ГБ.
int main()
{
int c[1000000];
cout << "done\n";
return 0;
}
Размер массива всего 4 Мб. Есть ли ограничение на размер массива, который можно использовать в c ++?
c++
arrays
segmentation-fault
Mayank
источник
источник
В C или C ++ локальные объекты обычно размещаются в стеке. Вы выделяете в стеке большой массив, больше, чем стек может обработать, поэтому вы получаете stackoverflow.
Не размещайте его локально в стеке, вместо этого используйте другое место. Этого можно достичь, сделав объект глобальным или разместив его в глобальной куче . Глобальные переменные подходят, если вы не используете их из других единиц компиляции. Чтобы это не произошло случайно, добавьте спецификатор статического хранилища, в противном случае просто используйте кучу.
Это будет выделено в сегменте BSS, который является частью кучи:
Это будет выделено в сегменте DATA, который также является частью кучи:
Это будет выделено в каком-то неопределенном месте в куче:
источник
delete
везде, где вы выделяетеnew
. Но если вы уверены, что выделяете память только один раз (как в main), в этом нет необходимости - память гарантированно будет освобождена при выходе из main даже без явного указанияdelete
.Кроме того, если вы работаете в большинстве систем UNIX и Linux, вы можете временно увеличить размер стека с помощью следующей команды:
Но будьте осторожны, память - это ограниченный ресурс, и с большой мощностью приходят большие обязанности :)
источник
Ваш массив выделяется в стеке, в этом случае попытайтесь выделить массив того же размера с помощью alloc.
источник
Потому что вы храните массив в стеке. Вы должны хранить его в куче. См. Эту ссылку, чтобы понять концепцию кучи и стека.
источник