Poprawne zwalniania pamięci - delete[]

0

Witam
Kilka miesięcy temu uczyłem się o dynamicznych tablicach wielowymiarowych, zgodnie z informacją na stronie stworzyłem poniższy kod:

short int		**		TBM			= new short int		*		[100];
	for (short int UTW = 0; UTW < 100; UTW++) TBM[UTW] = new short int [50];
	delete [] TBM[0];
	delete [] TBM;

Przeglądając teraz tą samą stronę, zamiast powyższego kodu zwalniania pamięci był poniższy:

	for (short int X = 0; X < 100; X++) delete [] TBM[X];
	delete [] TBM;

Czy pierwszy sposób zwalniania pamięci jest niepoprawny?

4

drugi kod zwalna Ci pamięć zajętą przez to co robiłeś w for (short int UTW = 0; UTW < 100; UTW++) TBM[UTW] = new short int [50]; a następnie zwalnia całą tablicę. Poprzedni zwalniał tylko pierwszy element tej tablicy nastepnie zwalniał tablicę. Oczywiście pierwszy kod był niepoprawny, bo najpeirw trzeba zwolnić wszystko w tablicy a potem tablicę.

1

Manualne zarządzanie pamięcią, pomijając kwestię nauki, mija się z celem i z grubsza można powiedzieć, że w poważnym kodzie nigdy tego nie powinieneś użyć. Zamiast tego masz std::vector, std::array i inne kontenery w bibliotece standardowej. RAII to jedna z największych zalet C++, nie powinieneś się wstydzić go używać.

2

Pierwszy kod jest poprawny dla tablic dwuwymiarowych dla których pierwszy indeks ma tylko jedną wartość (=0).
Drugi kod jest poprawny dla tablic dwuwymiarowych dla których pierwszy indeks jest w zakresie 0..99.
Zaletę std::vector, std::array docenisz gdy zaczniesz przesyłać między funkcjami zwykłe tablice dwuwymiarowe
(wbudowana składnia jest paskudna).

http://stackoverflow.com/questions/8767166/passing-2d-array-to-function

0

Bardzo dziękuję za odpowiedź, dotychczas mylnie sądziłem, że zwykła dynamiczna tablica jest wydajniejsza od std::vector oraz std::array.

Czy w momencie gdy używam std::vector, to należy pod koniec programu użyć funkcji clear?

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