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

Linijka "delete[] tablica;" crashuje aplikację

Ostatnio zmodyfikowano 2015-03-14 22:20
Autor Wiadomość
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.
C/C++
int main()
{
    cout << "Ile liczb w tablicy: ";
    cin >> ile;
   
    //dynamiczna alokacja tablicy
    int * tablica;
    tablica = new int[ ile ];
   
    //pokaz kolejne adresy komorek w tablicy
    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]
P-105891
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.
P-105892
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:
C/C++
int main()
{
    cout << "Ile liczb w tablicy: ";
    cin >> ile;
   
    //dynamiczna alokacja tablicy
    int * tablica;
    tablica = new int[ ile ];
   
    //pokaz kolejne adresy komorek w tablicy
    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.
P-105896
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
C/C++
int main()
{
    cout << "Ile liczb w tablicy: ";
    int ile;
    cin >> ile;
   
    //dynamiczna alokacja tablicy
    int * tablica = new int[ ile ];
   
    //pokaz kolejne adresy komorek w tablicy
    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?
P-105909
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.
P-105911
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:
C/C++
#include <iostream>

using namespace std;

int ile;

int main()
{
    cout << "Ile liczb w tablicy: ";
    cin >> ile;
   
    //dynamiczna alokacja tablicy
    int * tablica;
    tablica = new int[ ile ];
    int * w = tablica;
   
    //pokaz kolejne adresy komorek w tablicy
    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.
P-128399
« 1 »
  Strona 1 z 1