Cześć, napisałem program w którym stworzyłem listę jednokierunkową. Obiekty struct K1 to elementy listy, natomiast struct K2 to główny pojemnik listy. Przy kasowaniu listy (K2 baza;) wywołuje się destruktor który zwalnia kolejne elementy listy zwalnianiu dynamicznych (k1_1, k1_2, k1_3) jednak w momencie gdy usuwam ostatni element do program się wysypuje (gdy dodaje czwarty element, to trzeci już jest normalnie kasowany, a wysypuje się przy czwartym).
Nie rozumiem dlaczego występuje naruszenie ochrony pamięci, szczególnie, że wszystkie poprzednie elementy listy są zwalniane w ten sam sposób.
Żeby zadać to pytanie maksymalnie uprościłem oryginalny kod. Specjalnie usunąłem metody dostępowe i wszystkie zmienne obiektów są publiczne. Zdaję sobie sprawę że tak się nie robi.
#include <iostream>
using namespace std;
struct K1
{
K1* _next;
char _c;
K1(char c)
{
cout<<"utworzono ob. "<<this<<endl;
_c = c;
_next = 0;
}
void wypisz_dane_obiektu()
{
cout<<"this:"<<this<<" _c:"<<_c<<" _next:"<<_next<<endl;
}
~K1()
{
cout<<"skaskowano ob. "<<this<<endl;
}
};
struct K2
{
unsigned int ile_K1;
K1* pierwszy;
K1* ostatni;
~K2()
{
cout<<"kasowanie K2"<<endl;
K1* ob_poprzedni = pierwszy;
K1* obiekt_nastepny = pierwszy->_next;
while(true)
{
if(ob_poprzedni == 0)
return;
delete ob_poprzedni;
ob_poprzedni = obiekt_nastepny;
obiekt_nastepny = obiekt_nastepny->_next;
}
}
};
int main()
{
{
K2 baza;
K1* k1_1 = new K1('A');
K1* k1_2 = new K1('B');
K1* k1_3 = new K1('C');
k1_1->_next = k1_2;
k1_2->_next = k1_3;
k1_1->wypisz_dane_obiektu();
k1_2->wypisz_dane_obiektu();
k1_3->wypisz_dane_obiektu();
baza.ile_K1 = 3;
baza.pierwszy = k1_1;
baza.ostatni = k1_2;
//automatyczne wywolanie destruktora dla K2 baza;
}
cout<<"Tutaj obiekt 'baza' juz nie istnieje ale to juz sie nie wyswietli";
return 0;
}