[C++] Czy zawsze powinno się używać delete po użyciu new?


(Mattyp24) #1

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?


([alex]) #2

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.


(Pablo_Wawa) #3

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.


(Johny) #4

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.


(Rolek0) #5

Chyba nie do końca rozumiesz wskaźniki i alokacje pamięci. Polecam obejrzeć http://www.youtube.com/watch?v=bewTJaboGIw, http://www.youtube.com/watch?v=1I0ObS-RQvQ, http://www.youtube.com/watch?v=ICrBkVxkdVI, http://www.youtube.com/watch?v=mqCULVvaS1c, http://www.youtube.com/watch?v=YvA8tNm0FbA, http://www.youtube.com/watch?v=B7x-RWNGhgc, http://www.youtube.com/watch?v=_5pfrvlY_cA, http://www.youtube.com/watch?v=OuJMvfwblb0, http://www.youtube.com/watch?v=ByzWW_IiGU0.

Zdaje się, że robisz listę łączoną, więc warto jakbyś obejrzał jeszcze http://www.youtube.com/watch?v=euQN6Aohlsk, http://www.youtube.com/watch?v=Cn_ESB0x228, http://www.youtube.com/watch?v=zQsyjlQKMn8, http://www.youtube.com/watch?v=XJTzQQQfNYU, http://www.youtube.com/watch?v=lDtMoFP7ufQ.

Właściwie to możesz obejrzeć wszystkie filmy z tego kanału http://www.youtube.com/user/GynvaelColdwind, na pewno Ci to nie zaszkodzi :wink:

Mogę Ci jeszcze polecić dobre tutoriale do C++ http://xion.org.pl/productions/texts/coding/megatutorial/ oraz http://www.intercon.pl/~sektor/cbx/.

Możesz też poczytać http://gynvael.coldwind.pl/?id=238. Miłej zabawy :smiley:


(Mattyp24) #6

Dziękuję za wyjaśnienie. Teraz już rozumiem gdzie popełniłem błąd. Muszę się jeszcze dużo nauczyć o wskaźnikach. Dzięki również za przydatne linki.