2013-08-02 12 views
7

Ich möchte ein dynamisch zugewiesenes Array löschen, indem ich alle Elemente durchlaufen und delete auf jedem von ihnen aufrufen.
(Ich mache das, weil ich ein Array an einen anderen Ort "verschieben" muss, das heißt, das ursprüngliche Array kopieren und dann löschen, aber das würde zweimal die Zeit als das Kopieren jedes Elements und den Aufruf delete auf ihnen dauern einzeln)Löschen von Elementen eines dynamischen Arrays einzeln

ich habe den folgenden Code:

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

aber ich bin ein Segmentation Fehler bekommen jedes Mal, wenn ich diese laufen ....

Obwohl das funktioniert gut -:

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

Also, meine Vermutung ist, dass Löschen löscht das gesamte Array anstelle von einem einzelnen Element!

Könnte jemand bitte erklären, wenn meine Vermutung richtig ist, und wenn ja, schlagen Sie eine mögliche Abhilfe vor?

Ich bin mit GCC 4.7.3 auf 13,04 Ubuntu

+0

Die einfachste Methode ist die Verwendung von C++ - Standardcontainern (in diesem Fall 'std :: vector') anstelle von dynamischen Arrays und einfach die Erase-Methode des Containers. Aber was versuchst du auf der anderen Seite? Warum möchten Sie Elemente einzeln löschen? – Manu343726

+0

Eigentlich habe ich versucht, einen weiteren vektorähnlichen Container zu machen. [Nur um zu verstehen, wie 'std :: vectors 'unter der Haube funktionieren] –

+0

@Ammol C++ lernen? OK. Ihre Frage bezieht sich also auf den Destruktor des Vektors? Deshalb haben Sie versucht, ein Element nach dem anderen zu löschen? – Manu343726

Antwort

7

Sie können die Elemente nicht einzeln löschen. Wenn Sie mit new [] zuweisen, müssen Sie die Zuordnung mit delete [] aufheben. Was Sie hier tun:

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

es ist nicht korrekt. Sie rufen undefined Verhalten. Es scheint rein zufällig zu funktionieren und man kann sich nicht darauf verlassen.

Wie für dieses Problem zu umgehen, ist es nicht klar, was das Problem ist, aber wenn Sie möchten, dass das Array „bewegen“, könnte man es einfach auf einen anderen Zeiger zuweisen:

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

Ja, aber was war los mit 'delete (n + 1)'? Sind die einzelnen Speicherblöcke nicht nur mit 'new' zugeordnet? –

+0

@AnnomolSinghJaggi Es ist vom C++ - Standard nicht erlaubt. – juanchopanza

+3

@AnnolSinghJaggi der Punkt ist, dass 'new []' ein ganzes Array zuweist. Es ist nicht sinnvoll, einzelne Elemente des Arrays zu entfernen. Was könnte das OS mit ihnen machen? – juanchopanza

1

löschen
int *n=new int[2]; 

Verwendung

delete [] n; 

der Code

delete n; 

ist falsch, wenn Sie mit new [] zuweisen.

Verwandte Themen