Poniższy kod powoduje błąd segmentacji podczas uruchamiania na maszynie 2Gb, ale działa na maszynie 4GB.
int main()
{
int c[1000000];
cout << "done\n";
return 0;
}
Rozmiar tablicy to zaledwie 4 MB. Czy istnieje ograniczenie rozmiaru tablicy, której można używać w języku C ++?
c++
arrays
segmentation-fault
Mayank
źródło
źródło
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:
Spowoduje to alokację w segmencie DATA, który jest również częścią sterty:
Spowoduje to przydzielenie w jakiejś nieokreślonej lokalizacji w stercie:
źródło
delete
wszędzie tam, gdzie się znajdujesznew
. 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ścidelete
.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:
Ale uważaj, pamięć to ograniczony zasób, a z wielką mocą wiąże się wielka odpowiedzialność :)
źródło
Twoja tablica jest alokowana na stosie, w tym przypadku spróbuj zaalokować tablicę o tym samym rozmiarze za pomocą funkcji alert.
źródło
Ponieważ przechowujesz tablicę na stosie. Powinieneś go przechowywać na stercie. Zobacz ten link, aby zrozumieć koncepcję sterty i stosu.
źródło