Kyriet Temat założony przez niniejszego użytkownika |
Linijka "delete[] tablica;" crashuje aplikację » 2014-03-08 21:38:07 Na początek wklejam kod testowanej aplikacji i informuję, iż korzystam z Visual Studio Express 2012 for Desktop. int main() { cout << "Ile liczb w tablicy: "; cin >> ile; int * tablica; tablica = new int[ ile ]; for( int i = 0; i < ile; i++ ) { cout <<( int ) tablica << endl; tablica++; } delete[] tablica; tablica = NULL; _getch(); return 0; } Odpaliłem tą aplikację krokowo, czyli linia po linii i okazało się, że aplikacja crashuje się przy linijce celete[] tablica; . Oczywiście komunikat błędu wpisywałem w Google, lecz opisane tam problemy dotyczyły albo funkcji w klasach albo innych rzeczy całkowicie odbiegających od mojego problemu. Poniżej zamieszczam link do zdjęcia z błędem. http://a.disquscdn.com/uploads/mediaembed/images/879/678/original.jpg W opcjach Visual'a nic się nie bawiłem... no dobra, może poza dodaniem biblioteki winmm.lib w konsolidator --> wejście itp. Ale to jest mi potrzebne do odtwarzania dźwięku, choć nie sądzę, aby wpływało na taką banalną rzecz, jaką jest usuwanie... [pozwólcie, że nie napiszę czego, bo w sumie nie wiem czy zmiennej, tablicy, wskaźnika, dopiero zaczynam ze wskaźnikami] |
|
Monika90 |
» 2014-03-08 21:43:11 To z powodu: tablica++; Do delete należy przekazać wartość zwróconą z new, a nie inkrementowaną ileś tam razy. |
|
Kyriet Temat założony przez niniejszego użytkownika |
» 2014-03-08 23:10:13 Próbowałem różnie zinterpretować Twoją odpowiedź. Do delete wpisywałem jakieś wartości i nic nie wychodziło. Nie rozumiem nadal co mam zrobić. Tworem moich długich rozważań jest ten kod: int main() { cout << "Ile liczb w tablicy: "; cin >> ile; int * tablica; tablica = new int[ ile ]; for( int i = 0; i < ile; i++ ) { cout <<( int ) tablica[ i ] << endl; } delete[] tablica; tablica = NULL; _getch(); return 0; } Ale bardziej niepokojące jest wyjście tego programu. Ile liczb w tablicy: 5 -842150451 -842150451 -842150451 -842150451 -842150451 Jak wcześniej pisałem, jest to mój pierwszy kontakt ze wskaźnikami, a kod tego programu jest częścią internetowego kursu. Co ciekawe autorowi na Code::Blocks program jak najbardziej działa. Im więcej próbuję pracować ze wskaźnikami, tym bardziej się do nich zniechęcam. Temu działa, temu nie, w tym pisz tak, w tym pisz tak, tutaj radzicie nie inkrementować, tymczasem autor kursu tak robi i nie ma z tym problemu... <wzdycha z bezradności> Byłaby taka możliwość, aby ktoś napisał przerobioną wersję mojego programu tak, aby działała? Ponieważ pomimo porady Moniki, choć wiem teraz w czym jest problem, to nadal nie wiem jak go rozwiązać. #Edit Próbowałem, próbowałem i coś mi wyszło sensownego. Przed delete[] tablica dodałem jeszcze jedna linijkę tablica = NULL . Nadal jednak sądzę, że istnieje bardziej profesjonalne rozwiązanie tego problemu, niż za każdym razem przed kasowaniem tablicy, czyścić jej zawartość. Przecież to jest według mnie bez sensowne posunięcie w C++, a bez inkrementacji nie wyobrażam sobie wykonania tego programu. |
|
Monika90 |
» 2014-03-09 11:04:30 Nie przyszło mi do głowy, że można różnie interpretować moją odpowiedź. Oto twój pierwszy program poprawiony int main() { cout << "Ile liczb w tablicy: "; int ile; cin >> ile; int * tablica = new int[ ile ]; for( int i = 0; i < ile; i++ ) { cout << tablica + i << endl; } delete[] tablica; }
Może zdradzisz, co to za kurs internetowy? A że się zniechęcasz do używania wskaźników, to bardzo dobrze, po co używać wskaźników bez potrzeby? |
|
pekfos |
» 2014-03-09 11:26:13 | Próbowałem, próbowałem i coś mi wyszło sensownego. Przed delete[] tablica dodałem jeszcze jedna linijkę tablica = NULL . Nadal jednak sądzę, że istnieje bardziej profesjonalne rozwiązanie tego problemu, niż za każdym razem przed kasowaniem tablicy, czyścić jej zawartość. |
To nie rozwiązanie problemu. delete nic nie robi, gdy podany wskaźnik jest wyzerowany. Zaalokowana pamięć nie jest zwalniana. | Im więcej próbuję pracować ze wskaźnikami, tym bardziej się do nich zniechęcam. Temu działa, temu nie, w tym pisz tak, w tym pisz tak, tutaj radzicie nie inkrementować, tymczasem autor kursu tak robi i nie ma z tym problemu... <wzdycha z bezradności> |
Jeśli ten sam kod raz działa, a raz nie, to znaczy, że jest niepoprawny. Zachowanie programu niepoprawnie używającego wskaźników jest trudne do przewidzenia. Skoro taki (niepoprawny) kod znalazłeś w kursie, to kontynuuj naukę z innego kursu. Nie ma sensu uczyć się ze złych przykładów i zniechęcać się do, często bardzo użytecznej, funkcjonalności języka. |
|
Kyriet Temat założony przez niniejszego użytkownika |
» 2015-03-14 22:20:40 Pomimo tego, ze minął już ponad rok od założenia tego wątku, postanowiłem napisać ten post. Po pierwsze: jak to teraz czytam, to bardzo emocjonalnie (niepotrzebnie) podszedłem do problemu. Obecnie moja wiedza na temat wskaźników jest wystarczająco duża i potrafiłem ten problem (przed chwilą) rozwiązać w 5 sekund. Chodziło o to, aby pokazać, że adresy komórek zwiększają się co 4. Błąd polegał na samym zapisie: tablica++ Dziwi mnie, że kompilator przełknął coś takiego. Grębosz napisał: "Nazwa tablicy jest wskaźnikiem do jej zerowego elementu, lecz nie jest to zwykły wskaźnik, tylko taki, którego nigdy nie będziemy przesuwać (czyli: const)" Poprawiony kod: #include <iostream>
using namespace std;
int ile;
int main() { cout << "Ile liczb w tablicy: "; cin >> ile; int * tablica; tablica = new int[ ile ]; int * w = tablica; for( int i = 0; i < ile; i++ ) { cout <<( int ) w << endl; w++; } delete[] tablica; tablica = NULL; system( "Pause" ); return 0; }
Przepraszam, że nie dałem sobie pomóc. Teraz oficjalnie temat zamknięty. Pozdrawiam. |
|
| « 1 » |