2013-02-23 18 views
5

W prosty 1D tablicy:Jak mogę usunąć tę tablicę 2D w C++

node *nodes = new node[MAX_NODES]; 

kasowanie przez:

delete [] nodes; 

Usuwa wszystkie węzły przydzielone w tablicy.

Ale w tym przypadku:

float (*buildingArray)[3] = new float[10][3]; 

Czy stwierdzenie to zrobić buildingArray pojedynczej macierzy wymiaru wskaźników 3 pływaka? I to jest linia dealokacji:

delete[] buildingArray; 

Czy powyższe dealokacji delete tablica, ale jestem wątpliwe, czy będzie usuwać swoje referencje?

+0

Zamiast tego użyj wektorów - http://www.cplusplus.com/reference/vector/vector - O wiele łatwiej. –

+5

Czasami istniejąca podstawa kodu zmusza nas do korzystania z tablic dwuwymiarowych. Gdybym mógł komentować komentarze ... – codetaku

Odpowiedz

15

Czy powyższa de alokacja usuwa tablicę?

Tak jest.

Wystarczy przestrzegać zasady:

trzeba zadzwonić delete lub delete [] tyle razy jesteś zwane new lub new [] odpowiednio.


Jeśli miał tablicę wskaźników, gdzie każdy indeks została przydzielona pamięć dynamiczną, to trzeba wyraźnie pętla przez niego i zwalnianie Każdy element tablicy wyraźnie.


Na marginesie jesteś znacznie lepiej wyłączyć za pomocą std::vector lub std::array zamiast dynamicznie przydzielonego tablicy.

+0

dobrze, więc tutaj każdy element nie ma pamięci dynamicznej, tylko 1 wymiar (wiersze) ma pamięć dynamiczną, a 3 kolumny mają pamięć statyczną, więc nie trzeba ich deallokować. Czy mam rację ? – Anubha

+0

@Anubha: Instrukcja 'float (* buildingArray) [3] = new float [10] [3];' przydziela wystarczającą pamięć dynamiczną do przechowywania tablicy złożonej z 10 tablic z 3 zmiennymi. Całe miejsce na dysku znajduje się w trybie "freeestore" (inaczej "kupa"). Ale ponieważ przydzielono go za pomocą pojedynczego wywołania do 'new []', pojedyncze wywołanie 'delete []' doskonale to określa. –

+0

ok, więc w tym pytaniu http://stackoverflow.com/questions/936687/how-do-i-declare-a-2d-array-in-c-using-new, initailization tablicy używało 2 nowych instrukcji, w związku z tym prosty delete [] ary; nie działałby w takim przypadku? – Anubha

2

new float[10][3] przydziela tablicę składającą się z 10 tablic o rozmiarze 3 floats i zwraca wskaźnik do pierwszego elementu (który jest tablicą 3 płaszczyzn).

Wywołanie tego wskaźnika na delete[] powoduje usunięcie całej tablicy.

Jedyną różnicą między tymi dwoma przypadkami jest to, że w pierwszym przypadku typ wartości przechowywanych w dynamicznie przydzielanej tablicy to float, aw drugim przypadku typ to float[3].

3

Tak jest. Wyjaśnienie jest takie, że w pamięci nie ma informacji o tym, ile wymiarów ma twoja tablica.

Jeśli masz tablicę elementów 3 * 4, to jest dokładnie taka sama jak tablica 12 elementów. Jest to sposób, w jaki adresujesz określone elementy (które są przechowywane w linii po linii), które się zmieniają.

Tak delete[] będzie działać idealnie.

Ale korzystanie z operatorów new i delete nie jest tak powszechne w tych dniach z smart pointers, chyba że naprawdę masz dobry powód, aby samodzielnie kontrolować alokację.

Powiązane problemy