2010-11-16 16 views
25

mam to w moim kodu:Usuń wskaźnik do wskaźnika (jako tablicy tablic)

double** desc = new double* [size_out]; 
for (int i = 0; i < size_out; i++) 
    desc[i] = new double [size_in]; 

Jak usunąć ten desc?

powinienem zrobić:

delete [] desc; 

lub

for (int i=0; i<size_out; i++) 
    delete [] desc[i]; 
delete [] desc; 

lub

for (int i=0; i<size_out; i++) 
    delete [] desc[i]; 
delete desc; 

?

+0

Zapraszamy do obejrzenia tutaj: http://stackoverflow.com/questions/340943/c-multi-dimensional-arrays-on-the-heap –

Odpowiedz

16

Proste zasady do naśladowania:

  • dla każdego przydziału, nie musi być dealokacji (EX1 jest więc źle)
  • co przeznaczono użyciu new powinny być zwolnione przez delete korzystając new[] powinny być zwalniane stosując delete[] i korzystania malloc powinny być zwalniane za pomocą free (EX3 jest więc źle)

Wnioski, EX2 jest OK.

18

Twoje usunięcie powinno odzwierciedlać Twoją alokację.

Ponieważ użyłeś new [] do przydzielenia zewnętrznej tablicy i new [] (w pętli) w celu przydzielenia wewnętrznych tablic, wykonaj to samo w celu usunięcia. To znaczy: twoje drugie rozwiązanie jest poprawne; delete [] wewnętrzne tablice w pętli, a na końcu także zewnętrzna macierz poprzez delete [].

To powiedział, a (znacznie, znacznie) lepszym rozwiązaniem w C++ byłoby użyć zagnieżdżone std::vector:

// Declaration and initialization: 
vector<vector<double> > desc(size_out, vector<double>(size_in)); 

// No deletion! 
+1

+1 dla rozwiązania wektorowych. –

+0

Dzięki, ale niestety muszę użyć tego podwójnego ** – yelo3

4

zrobiłbym

for (int i=0; i<size_out; i++) 
    delete [] desc[i]; 
delete [] desc; 

dla każdej tablicy przydzielonego z new [], masz odpowiedni delete [].

Edytuj: a jak mówi Rupdolph: przestań używać tablic C i zacznij używać std::vector. Będziesz miał (mam na myśli sto razy!) Mniej błędów.

5

Rozwiązanie 2 jest właściwa: każda punkty komórki do dynamicznie przydzielonego tablicy, które powinny być usunięte przy użyciu delete[]. Na koniec, sama tablica powinna zostać usunięta przy użyciu delete[].

Rozwiązanie premiowe 4: unikaj używania tablic i przełącz na std::vector<std::vector<double> >.

17

Twój kod nie powinien się kompilować.Typ nowego wyrażenia tablicowego jest wskaźnikiem do typu tworzonego elementu tablicy (wartość jest wskaźnikiem do pierwszego elementu przydzielonej tablicy).

Tak więc typ new double**[size_out] to double ***.

Za każdym razem, gdy korzystasz z nowej formy tablicowej, musisz użyć postaci tablicy usuwania, nawet jeśli przydzielisz tylko tablicę o rozmiarze jeden.

double*** desc = new double**[size_out]; 
for (int i=0; i<size_out; i++) 
    desc[i] = new double*[size_in]; 


for (int i=0; i<size_out; i++) 
    delete[] desc[i]; 

delete[] desc; 

Należy pamiętać, że nie przydzielono jeszcze żadnego double, tylko wskaźniki.

Czy naprawdę tego chcesz?

double** desc = new double*[size_out]; 
for (int i=0; i<size_out; i++) 
    desc[i] = new double[size_in]; 

for (int i=0; i<size_out; i++) 
    delete[] desc[i]; 

delete[] desc; 
+0

+1 za wskazanie problemu z niedopasowaniem typu –

Powiązane problemy