Odpowiedzi:
Prawdopodobnie po prostu pojawia się przepełnienie stosu. Tablica jest zbyt duża, aby zmieścić się w przestrzeni adresowej stosu programu.
Jeśli alokujesz tablicę na stercie, wszystko powinno być w porządku, zakładając, że twoja maszyna ma wystarczającą ilość pamięci.
int* array = new int[1000000];
Ale pamiętaj, że będzie to wymagało delete[]
od tablicy. Lepszym rozwiązaniem byłoby użycie std::vector<int>
i zmiana rozmiaru na 1000000 elementów.
W C lub C ++ obiekty lokalne są zwykle przydzielane na stosie. Alokujesz dużą tablicę na stosie, więcej niż może obsłużyć stos, więc otrzymujesz przepełnienie stosu .
Nie przydzielaj go lokalnie na stosie, zamiast tego użyj innego miejsca. Można to osiągnąć poprzez uczynienie obiektu globalnym lub przydzielenie go na globalnej stercie . Zmienne globalne są w porządku, jeśli nie używasz żadnej innej jednostki kompilacji. Aby upewnić się, że nie stanie się to przypadkowo, dodaj statyczny specyfikator magazynu, w przeciwnym razie po prostu użyj sterty.
Spowoduje to alokację w segmencie BSS, który jest częścią sterty:
static int c[1000000];
int main()
{
cout << "done\n";
return 0;
}
Spowoduje to alokację w segmencie DATA, który jest również częścią sterty:
int c[1000000] = {};
int main()
{
cout << "done\n";
return 0;
}
Spowoduje to przydzielenie w jakiejś nieokreślonej lokalizacji w stercie:
int main()
{
int* c = new int[1000000];
cout << "done\n";
return 0;
}
delete
wszędzie tam, gdzie się znajdujesz new
. Ale jeśli jesteś pewien, że przydzielasz pamięć tylko raz (jak w main), nie jest to absolutnie potrzebne - pamięć jest na pewno zwolniona przy wyjściu z maina nawet bez jawności delete
.
Ponadto, jeśli pracujesz w większości systemów UNIX i Linux, możesz tymczasowo zwiększyć rozmiar stosu za pomocą następującego polecenia:
ulimit -s unlimited
Ale uważaj, pamięć to ograniczony zasób, a z wielką mocą wiąże się wielka odpowiedzialność :)
Twoja tablica jest alokowana na stosie, w tym przypadku spróbuj zaalokować tablicę o tym samym rozmiarze za pomocą funkcji alert.