Przekroczony limit pamięci - sygnał 6 (przy działaniu na dynamicznych tablicach)
Ostatnio zmodyfikowano 2010-11-24 18:48
Tiestes Temat założony przez niniejszego użytkownika |
Przekroczony limit pamięci - sygnał 6 (przy działaniu na dynamicznych tablicach) » 2010-11-24 14:04:23 Witam,
jestem początkujący w c++, dlatego proszę o wyrozumiałość w przypadku głupich błędów:)
mam problem z programem do transponowania macierzy, który napisałem używając dynamicznej tablicy dwuwymiarowej.
Program działa, jednak na kompilatorze http://ideone.com/ otrzymuję błąd:
wynik: Przekroczony limit pamięci czas: 0s pamięć: 3808 kB sygnał: 6
o treści:
terminate called after throwing an instance of 'std::bad_alloc'
what(): std::bad_alloc
domyślam się że chodzi o wyciek pamięci który sprawdziłem za pomocą porad zamieszczonych w tym artykule: http://cpp0x.pl/artykuly/?id=4
błąd wskazał miejsce definiowania tablicy (int **tab=new int*[m];)
Poniżej zamieszczam polecenia z kodu odpowiedzialne za tworzenie i usuwanie tablicy.
int m, n; int ** tab = new int *[ m ]; cin >> m >> n; for( int j = 0; j < m; j++ ) tab[ j ] = new int[ n ];
. . . for( int j = 0; j < m; j++ ) delete[] tab[ j ];
delete[] tab; getch(); return 0; }
Jeżeli ktoś ma jakiś pomysł, na rozwiązanie powyższego błędu lub może na inne zdefiniowanie tablicy, bardzo bym prosił o pomoc.
Pozdrawiam |
|
DejaVu |
» 2010-11-24 14:10:03 Najpierw rezerwujesz pamięć, a potem wczytujesz ile elementów należy zarezerwować. Reasumując: masz wartość przypadkową w pamięci, więc program się wywali. |
|
Tiestes Temat założony przez niniejszego użytkownika |
» 2010-11-24 14:30:48 Dziękuję za odpowiedź. Jednak nadal nie za bardzo wiem jak rozwiązać ten problem... Tablice tworzę i usuwam z pamięci w dobry sposób? |
|
DejaVu |
» 2010-11-24 15:35:10 int ** tab = new int *[ m ]; cin >> m >> n;
Zastanów się nad sensem powyższych linijek. |
|
Tiestes Temat założony przez niniejszego użytkownika |
» 2010-11-24 15:58:30 Zmiana kodu na taką postać: int m, n; cin >> m >> n; int ** tab = new int *[ m ]; for( int j = 0; j < m; j++ ) tab[ j ] = new int[ n ];
. . . for( int j = 0; j < m; j++ ) delete[] tab[ j ];
delete[] tab; getch(); return 0; }
nie rozwiązuje problemu. Wciąż pojawia się ten sam błąd.
W linku zamieszczam print screen'a tego błędu oraz kompilacji mojego programu przez http://ideone.com. http://img35.imageshack.us/img35/831/bladwx.png
Początkowo miałem właśnie powyższą wersję jednak w akcie desperacji, gdy cały czas pojawiał mi się ten błąd zacząłem wszystko po kolei zmieniać i ostatecznie wysłałem przez nie uwagę zmienioną wersję.
Czy może jeszcze chodzi Ci o coś innego czego nie widzę?
|
|
Elaine |
» 2010-11-24 16:29:55 Nie podajesz żadnego wejścia, więc m i n mają wartości osobliwe, w wyniku czego program próbuje zaalokować, jak się okazuje, za dużo pamięci. |
|
Tiestes Temat założony przez niniejszego użytkownika |
» 2010-11-24 16:46:35 Wybaczcie, ale wciąż nie mam pojęcia jak to zrobić żeby działało. Rozumiem już o co chodzi, jednak nie wiem co zrobić, żeby ograniczyć tą alokację pamięci. |
|
Elaine |
» 2010-11-24 16:59:25 Na przykład podać wejście, bo obecnie program bierze wartości z sufitu? |
|
« 1 » 2 3 |