Відповіді:
Ви, мабуть, просто отримуєте переповнення стека. Масив занадто великий, щоб вміститись у адресний простір стека вашої програми.
Якщо ви виділите масив на купі, вам слід добре, припускаючи, що у вашої машини достатньо пам'яті.
int* array = new int[1000000];
Але пам’ятайте, що для цього вам знадобиться delete[]
масив. Кращим рішенням буде використання std::vector<int>
та зміна розміру до 1000000 елементів.
В C або C ++ локальні об'єкти зазвичай виділяються на стеку. Ви виділяєте великий масив на стеку, більше, ніж стек може обробити, тому ви отримуєте stackoverflow.
Не виділяйте його локальним на стек, використовуйте замість цього якесь інше місце. Цього можна досягти, або зробивши об'єкт глобальним, або розподіливши його на глобальній купі . Глобальні змінні чудові, якщо ви не використовуєте жоден інший блок компіляції. Щоб переконатися, що це не трапилося випадково, додайте статичний специфікатор зберігання, інакше просто використовуйте купу.
Це виділить у сегменті BSS, який є частиною купи:
static int c[1000000];
int main()
{
cout << "done\n";
return 0;
}
Це виділить у сегменті DATA, який також є частиною купи:
int c[1000000] = {};
int main()
{
cout << "done\n";
return 0;
}
Це виділить у певному не визначеному місці в купі:
int main()
{
int* c = new int[1000000];
cout << "done\n";
return 0;
}
delete
всіх, де ви виділяєте new
. Але якщо ви впевнені, що ви виділяєте пам'ять лише один раз (як і в основному), вона категорично не потрібна - пам'ять гарантовано буде звільнена на виході основної навіть без явного delete
.
Крім того, якщо ви працюєте в більшості систем UNIX та Linux, ви можете тимчасово збільшити розмір стека за допомогою наступної команди:
ulimit -s unlimited
Але будьте обережні, пам'ять - це обмежений ресурс і з великою потужністю приходять великі обов'язки :)
У цьому випадку масив виділяється на стек, намагаючись виділити масив однакового розміру за допомогою alloc.
Тому що ви зберігаєте масив у стеку. Ви повинні зберігати його в купі. Перейдіть за цим посиланням, щоб зрозуміти поняття купи та стека.