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

Kasowanie tablic w liście i samego wskaźnika

Ostatnio zmodyfikowano 2017-04-24 22:11
Autor Wiadomość
ultra
Temat założony przez niniejszego użytkownika
Kasowanie tablic w liście i samego wskaźnika
» 2017-04-23 20:10:15
Cześć, mam listę jednokierunkową, w każdym elemencie mam zainicjowane dwie tablice. Podczas gdy czyszczę listę otrzymuję błąd "Zgłoszony wyjątek". Nie mam zielonego pojęcia dlaczego to się tak dzieje, może Wy macie jakiś pomysł?

C/C++
struct lista
{
    lista * next;
    char znak[ 20 ];
    int cyfra[ 20 ];
} * head;

void czysc( lista *& head )
{
    lista * p;
    p = head;
   
    if( p == nullptr ) return;
   
    do
    {
        head = p->next;
        delete p;
    } while( head != nullptr );
   
}
P-160439
pekfos
» 2017-04-23 20:13:09
C/C++
do
{
    head = p->next;
    delete p;
} while( head != nullptr );
Wielokrotnie wołasz delete p, ale p się nie zmienia.
P-160440
ultra
Temat założony przez niniejszego użytkownika
» 2017-04-23 20:18:11
Jak mogłem tego nie zauważyć, dzięki :D Dopisałem do funkcji zmianę p na głowę, ale hm, nadal błąd się pojawia.
P-160442
pekfos
» 2017-04-23 20:48:28
Minimalny przykład powodujący błąd.
P-160444
ultra
Temat założony przez niniejszego użytkownika
» 2017-04-23 20:59:03
Hm to jest chyba wina VS bo teraz to nawet błąd wyskakuje przy tworzeniu nowego wskaźnika.
P-160445
ultra
Temat założony przez niniejszego użytkownika
» 2017-04-23 22:33:48
Ok, to jednak nie wina VS.

Więc tak. Na początku pakuję do tablic w liście wartości.

Moja lista wygląda w ten sposób:
C/C++
lista->znak[ 0 ] = 'a';
lista->cyfra[ 0 ] = 1;
lista->znak[ 1 ] = 'b';
lista->cyfra[ 1 ] = 1;
lista->znak[ 2 ] = 'c';
lista->cyfra[ 2 ] = 1;
lista->znak[ 3 ] = 'd';
lista->cyfra[ 3 ] = 1;
lista->znak[ 4 ] = 'e';
lista->cyfra[ 4 ] = 1;

I tak dalej, i tak dalej. Następnie wykonuje operacje na tej liście, zamianę wskaźników kolejnością, wypisywanie, dopisywanie do niej. Na koniec listę chcę zwolnić z pamięci więc wykonuję ten kod, który podałem wcześniej. Do head przypisuje mi pięknie następnika wskaźnika, mój wskaźnik p jest odłączony od listy (ale nadal zawiera kolejne wskaźniki w polu ->next) i teraz wywołuje delete p;. W tym momencie wyskakuje mi błąd "Zgłoszony wyjątek": "Element program.exe wyzwolił punkt przerwania.: wystąpił wyjątek".

Nie mam pojęcia dlaczego tak się dzieje. Piszę w Visual Studio 2017. Wolałbym kodu nie wstawiać, ale jeśli to będzie potrzebne, to chciałbym go później skasować, wiadomo, moje wypociny.
P-160450
pekfos
» 2017-04-23 22:38:51
Zajmująca historia, ciężko jednak ją debugować.

ale jeśli to będzie potrzebne, to chciałbym go później skasować, wiadomo, moje wypociny.
Kasowanie treści postów to szybki sposób na bana. To będzie już twój drugi raz..
P-160454
ultra
Temat założony przez niniejszego użytkownika
» 2017-04-24 22:11:27
Naprawiłem błąd :) Problem był taki, że miałem dwie funkcje nazwane tak samo ale z innymi parametrami.
P-160475
« 1 »
  Strona 1 z 1