Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

[C++] Naruszenie ochrony pamięci przy alokowaniu na stosie 3 000 000 obiektów int

Ostatnio zmodyfikowano 2012-11-04 15:59
Autor Wiadomość
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:
C/C++
#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
P-68120
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.
P-68125
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.
P-68127
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 - GCC

Więcej informacji:
Frazy, które należy wpisać w wyszukiwarkę google:
P-68128
withelm
» 2012-11-02 00:34:37
P-68142
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.
P-68182
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.html

Ehh, Dejavu w jednym z linków to ujął :)
Swoją drogą przydałaby się możliwość usuwania własnych postów.
P-68451
« 1 »
  Strona 1 z 1