Hej. Od niedawana uczę się C++ i mam pewien problem. Napisałem prosty program w którym mam taką oto funkcję:
void Klasa::Add(Klasa *&First, int ID)
{
Klasa * tmp = new Klasa;
tmp->ID=ID;
tmp->next=First;
First = tmp;
delete tmp;
}
Bez ostatniej linijki wszystko działa jak należy. Po użyciu delete wywala mi błąd “Unhandled exception at xxx in xxx: Access violation reading location xxx”
Niby mogę go pominąć, ale zastanawia mnie gdzie zrobiłem błąd. Czy może nie zawsze trzeba zwalniać pamięć deletem? Jak to w końcu jest? Delete to przymus, czy tylko dobry nawyk programistów?
Jeżeli już koniec programu to nie koniecznie, ale to nie jest koszerne rozwiązanie ponieważ później możesz zapomnieć o tym że darowałeś sobie, dodać pętle i masz wyciek.
delete nie musi być to tej samej funkcji, ba nawet nie musi być w tym samym pliku .cpp
Zaś w tym przypadku co podałeś nie wolno robić delete w tej metodzie
Delete muszą być w metodzie Remove/Delete oraz w destruktorze, ewentualnie w metodzie Clear.
Wydaje mi się, że w tym konkretnym kodzie nie wolno kasować (delete) obiektu tmp, ponieważ jest on wciąż używany (wskazuje na niego zmienna First) po wyjściu z metody Add i stąd masz ten błąd wykonania kodu.
Robisz błąd,o którym kolega wyżej wspomniał,usuwając wskażnik usuwasz ten element czyli obiekt klasy Klasa z pamięci.
To możesz robić tylko w destruktorze przy czyszczeniu listy.
To nie jest tak jak z tablicami gdzie do jakiegoś elementu przypiszesz zero i jest ok.,delete zwalnia pamięć,adres wskazywany przez tmp,nie tylko sam wskażnik.
First nie ma potem na co wskazywać i jest pogwałcenie zasad dostępu do obiektu,którego już nie ma.