[C++] Naruszenie ochrony pamięci przy alokowaniu na stosie 3 000 000 obiektów int
Ostatnio zmodyfikowano 2012-11-04 15:59
kacpero1094 Temat założony przez niniejszego użytkownika |
[C++] Naruszenie ochrony pamięci przy alokowaniu na stosie 3 000 000 obiektów int » 2012-11-01 17:19:39 Cześć! W moim programie potrzebuję trzy tablice obiektów int po 1 000 000 obiektów każda (alokowane przy uruchomieniu programu - nie dynamicznie). W skrócie wygląda to tak: #include <iostream> const int limit = 1000000; int main() { int a[ limit ], b[ limit ], c[ limit ]; return 0; }
Przy uruchomieniu programu otrzymuję komunikat: Naruszenie ochrony pamięci (core dumped) Korzystam z 64-bitowego Linuxa Ubuntu i kompilatora g++4.6.x |
|
cyklopek11 |
» 2012-11-01 18:00:22 Alokuj dynamicznie przy starcie programu i po problemie.
PS Sprawdziłem (gcc, na Windowsie), że wersje debug dają ten błąd. Jak się skompiluje w trybie release to jest ok. Jesli już nie chcesz dynamicznego alokowania to skompiluj w wersjii Release swój kod i sprawdź czy na Linuxie działa. |
|
kacpero1094 Temat założony przez niniejszego użytkownika |
» 2012-11-01 18:34:46 Na takie rozwiązanie sam wpadłem. Nie chcę tutaj korzystać z dynamicznej alokacji. |
|
DejaVu |
» 2012-11-01 18:55:43 Każda aplikacja posiada własny stos, który jest wykorzystywany do alokowania zmiennych tworzonych w aplikacji 'w locie'. Wartość ta jest przypisana 'na sztywno' do każdej aplikacji i wartość ta jest różna w zależności od domyślnych ustawień kompilatora. Wspomnianą wartość można zmienić, jednak konieczność zmiany domyślnych wartości oznacza albo całkowity brak wiedzy programisty tego co robi, albo projekt jest bardzo duży i w pewnym specyficznym przypadku zaczyna po prostu brakować pamięci na stosie w trakcie działania aplikacji, co prowadzi do jej 'zgonu'. Modyfikowanie rozmiaru stosu - Visual C++Modyfikowanie rozmiaru stosu - GCCWięcej informacji: |
|
withelm |
» 2012-11-02 00:34:37 |
|
crash |
» 2012-11-02 13:31:15 Nie chcę tutaj korzystać z dynamicznej alokacji. |
Czemu? Gwiazdka w tą czy w tamtą, albo strzałka. Taka fajna strzałka. |
|
Badman |
» 2012-11-04 15:59:54 Jeśli chcesz zobaczyć jaki rozmiar pamięci przeznaczono na stos to w konsoli / terminalu ulimit -a | grep stack
w celu zmainy rozmiaru stosu ulimit -s 16384 z tym, że zmieniony stos jest dla aktualnego terminala, więc program musiałbyś uruchamiać z spod tego terminala. Chcąc na stałe zwiększyć stos musiałbyś na początku programu przed int a[ limit ], b[ limit ], c[ limit ]; ustawiać rozmiar stosu http://man.przez.net/getrusage.2.htmlEhh, Dejavu w jednym z linków to ujął :) Swoją drogą przydałaby się możliwość usuwania własnych postów. |
|
« 1 » |