Zwalnianie pamięci wskazniki

0

Witam! Mam małą klasę:

class Czlon
{
public:
	int * m;
	int * t;

	int * x;

	int * w;
 

I teraz wskaznik m i t jest jako tablica dynamiczna, natomiast x i w to wskazniki do pojedynczej danej. W main tworze tablice dynamiczna obiektow typu Czlon:

 Czlon * czlon = new Czlon[20];

Jak będzie wyglądało tutaj zwalnianie pamięci...? Wystarczy ze zrobię tylko

delete [] czlon; 

Czy musze najpierw zwolnic wewnętrzne tablice? tzn w pętli for zwalniac m,t,x,w??

0

Wewnętrzne tablice powinien zwolnić destruktor, po to istnieje.
Po kiego robisz to tak: Czlon * czlon = new Czlon[20]; kiedy możesz tak: vector<Czlon> czlon(20); - nawet łatwo da się powiększyć, nie to co twój ... pomysł.

0

Musisz zwalniać wszystko, co zaalokowałeś ręcznie. Jeżeli klasa Czlon nie zwalnia w destruktorze zasobów, które zaalokowała, będziesz mieć wyciek pamięci przy usunięciu tablicy obiektów typu Czlon. Aby uniknąć takich problemów używaj kontenerów, które same dbają o pamięć: w tym przypadku std::vector<T>.

0

no wiem ale to było pisane, żeby zrozumieć...

0

Prosta zasada brzmi: jeśli gdzieś wstukałeś new to powinieneś też gdzieś mieć delete. Stosunek 1:1. Czyli jeśli sam zaalokowałeś te tablice, to sam też masz je zwolnić.
Czasami ta zasada nie jest prawdziwa, np. klasa alokuje pamięć, przekazuje wskaźnik komuś innemu i tamten ma sprzątać. Niemniej w Twoim przypadku ta zasada jest ok.

A najlepiej to nigdzie nie wstukać tego new. Zamiast tablic użyj std::vector, zamiast gołych wskaźników unique_ptr, shared_ptr. I wtedy problem zwalniania przestaje istnieć.

0

oki dzięki za odp :)

1 użytkowników online, w tym zalogowanych: 0, gości: 1