Ten kod jest zdecydowanie źle (dodałem komentarz)!
//przed stworzeniem nowej listy
if ((pierwszy!=NULL)&&(ostatni!=NULL)){
element *pom, *pom2;
pom=pierwszy;
for (int i=0;pom->nastepny!=NULL;){
pom2=pom;
delete pom;
pom=pom2->nastepny; // naprawdę nie masz tu crasha? Operujesz na usuniętym elemencie!
delete pom2;
}
delete pom;
delete pom2;
delete pierwszy;
delete ostatni;
}
W zasadzie to tak naprawdę nie wiadomo co to ma robić! Wygląda strasznie.
Najważniejsze to ustalić gdzie ci cieknie. Nie zdziwiłbym się gdyby się okazało, że obwiniasz kod który nie cieknie.
Albo zapoznasz się z narzędziami do analizy pamięci.
Kurcze, faktycznie jest operacja na usuniętym elemencie, ale nic mi nie wywala :/ Nie wiem jak to rozwiązać.
Co ma robić? Ma usuwać listę z pamięci. Lista jest zbudowana z elementów wypisanych w pierwszym poście. Każdy element wskazuje na poprzednika i następcę, a jeśli takiego nie ma to jest NULL. Dodatkowo lista ma zadeklarowany element pierwszy i ostatni.
Zaraz będę kombinował z poradami z Waszych postów, ale tak średnio zrozumiałem, co jest nie halo :/
Wymyśliłem sobie koncepcję przesuwania się od początku do końca i usuwania każdego elementu po kolei... Ale teraz chciałbym się dowiedzieć - jeśli usuwam przez delete element zadeklarowany j.w. to czy zwalniana jest także jego wartość (mam na myśli część klasy element).
ADD:
Jeżeli nie jesteś pewny czy w argumencie do delete jest prawidłowy wskaźnik to ustaw go po każdym delete na NULL.
Czyli zamiast "delete wsk;" uzywaj "delete wsk;wsk = NULL;". O ile podwójne zwolnienie pamieci nie wróży niczego dobrego o tyle zwolnienie NULL'a nic nie powoduje.
Co do kodu warto zastanowić się co się tam dzieje
if ((pierwszy!=NULL)&&(ostatni!=NULL)){
element *pom, *pom2;
pom=pierwszy;
for (int i=0;pom->nastepny!=NULL;){
pom2=pom; //kopia wskaznika
pom=pom2->nastepny; //kopia wskaznika nastepny, puki jeszcze istnieje
delete pom2; //usun z pamieci
}
//ostatnia interacja, pozostal Ci ogon, a więc zwalniasz go i tylko go
delete pom; //lub delete ostatni;
}
Przerobiłem - faktycznie taki kod ma więcej sensu. Niestety to nie rozwiązało problemu. Widocznie gdzieś w innym miejscu zostają mi zmienne.
W jaki sposób mogę to wykryć? Jakiego narzędzia użyć?
ADD2:
A być może cieknie przy samym dodawaniu, chociaż sam już nie wiem, oto kod:
double lista::dodaj(int indeks, int unsigned wartosc){
//metoda dodająca podaną przez użytkownika wartość na podany przez użytkownika indeks
element * ten = new element;
element * pom = new element;
pom=pierwszy;
Czas.start();
if ((ostatni==NULL)&&(pierwszy==NULL)){
//jeśli jest to pierwszy element
ten->wartosc=wartosc;
ten->nastepny=NULL;
ten->poprzedni=NULL;
ostatni = ten;
pierwszy = ten;
}else{
for (int i=0;i<indeks-1;i++){
if ((pom->nastepny==NULL)&&(indeks-i>1)){
//sprawdzenie, czy nie indeks nie jest poza zakresem
cout<<indeks<<"-"<<i<<"="<<indeks-i<<endl;
cout<<"BLAD - indeks poza zakresem"<<endl;
delete ten;
delete pom;
Czas.stop();
return Czas.wynik();
}
pom=pom->nastepny;
}
if (indeks==0){
ten->wartosc=wartosc;
ten->nastepny=pierwszy;
ten->poprzedni=NULL;
pierwszy->poprzedni=ten;
pierwszy=ten;
}
else if (pom->nastepny==NULL){
//jeśli jest to ostatni element
ten->wartosc=wartosc;
ten->poprzedni=ostatni;
ten->nastepny=NULL;
ostatni->nastepny=ten;
ostatni=ten;
}
else{
//dodanie w środku listy
ten->wartosc= wartosc;
ten->poprzedni = pom;
ten->nastepny = pom->nastepny;
pom->nastepny->poprzedni=ten;
pom->nastepny=ten;
}
}
delete ten;
delete pom;
Czas.stop();
return Czas.wynik();
}