2013-08-02 19 views
7

Chcę usunąć dynamicznie przydzieloną tablicę, przechodząc przez wszystkie elementy i wywołując delete na każdym z nich.
(Robię to, ponieważ muszę "przenieść" tablicę do innej lokalizacji, to znaczy skopiować oryginalną tablicę, a następnie ją usunąć, ale to zajęłoby 2x czas niż jednoczesne skopiowanie każdego elementu i wywołanie na nim delete indywidualnie)Usuwanie elementów tablicy dynamicznej jeden po drugim

mam następujący kod:

int main() 
{ 
    int *n=new int[2]; 
    delete n; 
    delete (n+1); 
} 

ale otrzymuję błąd segmentacji za każdym razem uruchomić to ....

Chociaż to działa prawidłowo -:

int main() 
{ 
    int *n=new int[1]; 
    delete n; 
}  

Domyślam się, że delete kasuje całą tablicę zamiast pojedynczego elementu!

Czy ktoś mógłby wyjaśnić, jeśli moje przypuszczenie jest słuszne, a jeśli tak, zasugerować możliwe obejście tego problemu?

Używam GCC 4.7.3 na Ubuntu 13.04

+0

Najprostszym sposobem na to jest użycie standardowych kontenerów C++ ('std :: vector' w tym przypadku) zamiast dynamicznych tablic i po prostu użyj metody wymazywania kontenera. Ale z drugiej strony, co próbujesz zrobić? Dlaczego chcesz usuwać elementy jeden po drugim? – Manu343726

+0

Właściwie to próbowałem stworzyć kolejny pojemnik podobny do wektora. [Tylko po to, aby lepiej zrozumieć, w jaki sposób 'std :: vectors' działa pod maską] –

+0

@Ammol nauczyć się C++? ok. Więc twoje pytanie dotyczy destruktora wektora? Właśnie dlatego próbujesz usunąć jeden element po jednym? – Manu343726

Odpowiedz

7

Nie możesz usuwać elementy indywidualnie. Po przydzieleniu przy pomocy new [] należy zwolnić z delete []. Co tutaj robisz:

int *n=new int[1]; 
delete n; // ERROR: should be delete [] 

To nie jest poprawne. Wywołujesz niezdefiniowane zachowanie. Wydaje się działać przez przypadek i nie można na nim polegać.

chodzi o obejście, nie jest jasne, na czym polega problem, ale jeśli chcesz, aby „przenieść” tablicę, można po prostu przypisać go do innego wskaźnika:

int* n=new int[2]; 
... 
int* m = n; 
n = nullptr; 
.... 
delete [] m; 
+0

Tak, ale co było nie tak w 'delete (n + 1)'? Czy poszczególne bloki pamięci nie są przydzielane tylko za pomocą 'nowego'?! –

+0

@AnmolSinghJaggi To nie jest dozwolone przez standard C++. – juanchopanza

+3

@AnmolSinghJaggi chodzi o to, że 'new []' przydziela całą tablicę. Nie ma sensu de-alokować pojedynczych elementów tablicy. Co mógłby z nimi zrobić system operacyjny? – juanchopanza

1

Aby usunąć

int *n=new int[2]; 

użycie

delete [] n; 

kod

delete n; 

jest niepoprawny, gdy przydzielasz za pomocą nowego [].

Powiązane problemy