2010-08-07 4 views
6

Ich sah ein Beispiel für die Verwendung der Funktion: Löschen in cpp und ich habe es nicht vollständig verstanden. der Code:löschen Funktion in C++

class Name { 
    const char* s; 
    //... 
}; 

class Table { 
     Name* p; 
     size_t sz; 
public: 
     Table(size_t s = 15){p = new Name[sz = s]; } 
     ~Table { delete[] p; } 
}; 

Was ist die genaue Wirkung des Befehls: delete[] p;?

Ich denke, das Ziel war es, alle Zeiger in der Container-Tabelle zu löschen.

Die Klammern in delete[] geben mir einen Hinweis, dass es ein Array von Zeigern auf Name löscht, aber die Größe des Arrays ist nicht angegeben, also wie "weiß" der Destruktor, wie viele Zeiger zu löschen?

+0

möglich duplikat von [löschen vs löschen \ [\] operators in C++] (http://stackoverflow.com/questions/2425728/delete-vs-delete-operators-in-c) und [Wie funktioniert das Löschen in C++ weiß, wie viele Speicherbereiche gelöscht werden sollen (http://stackoverflow.com/questions/2327848/how-does-the-delete-in-c-know-how-many-memory-locations-to-delete) –

+1

" alle Zeiger "- Beachten Sie, dass' Table' nur einen einzelnen Zeiger enthält. Es ist ein Zeiger auf ein dynamisch zugewiesenes Array von 'Name', aber es muss nur ein dynamisch erstelltes Objekt (das Array) freigegeben werden. –

Antwort

13

delete ist keine Funktion, es ist ein Operator.

Ein Ausdruck mit [] zerstört Objekte, die mit new ... [] erstellt wurden, und gibt den zugehörigen Speicher frei. delete[] muss für Zeiger verwendet werden, die von new ... [] zurückgegeben werden; Nicht-Array delete nur für Zeiger, die von Nicht-Array new zurückgegeben werden. Die Verwendung des nicht übereinstimmenden Formulars delete ist immer falsch.

Der delete Ausdruck in ~Table() (() im Code fehlt) wird die Gewährleistung der dynamisch erstellten Array von Name Objekte zerstören, dass die Name destructor für jedes Mitglied des Arrays aufgerufen wird.

Es ist die Implementierung, um einen Mechanismus zum Aufzeichnen der Anzahl der Elemente in Arrays zu implementieren, die mit new ... [] zugewiesen werden, der Programmierer muss sich nicht darum kümmern.

In vielen Implementierungen, in denen die Array-Elemente nicht-triviale Destruktoren haben, wird ein new[]-Ausdruck zusätzlichen Speicherplatz zuweisen, um die Elementanzahl vor dem Speicherplatz für alle Array-Mitglieder aufzuzeichnen. Diese versteckte Anzahl wird dann nachgeschlagen, wenn delete[] verwendet wird, um sicherzustellen, dass die korrekte Anzahl von Destruktoren aufgerufen wird. Dies ist nur ein Implementierungsdetail, andere Implementierungen sind jedoch möglich.

+0

1) Im Code können viele Objekte mit neuen ... [] initialisiert werden, welche von ihnen wird durch Löschen zerstört? 2) auch im Beispielcode() fehlte. –

+2

@Day_Dreamer: Ein anderer Weg, um darüber nachzudenken, ist als ein einzelnes Array von vielen Objekten. 'new Name [sz]' reserviert ein Array (mit vielen Objekten) 'delete []' löscht das eine Array (von vielen Objekten). Jedes Mitglied des Arrays wird zerstört, wenn das Array zerstört wird. –

1

Kurz gesagt, delete[] kennt die Größe des Arrays, das gelöscht wird, weil es erforderlich ist.

Weil der C++ - Sprachstandard besagt, dass es wissen muss. Wenn Sie also ein Array zuweisen, muss das System die Größe irgendwo speichern, wo delete[] es finden kann.

Eine Option besteht darin, ein paar Bytes mehr als benötigt zuzuweisen. Verwenden Sie die ersten Bytes, um die Größe anzugeben, und geben Sie dann einen Zeiger auf das erste Byte nach dem Größenfeld zurück, anstatt einen Zeiger auf das erste zugeordnete Byte zurückzugeben.

Dann muss delete[] nur ein paar Bytes vom Zeiger subtrahieren, um die Größe zu finden.

Eine andere Option könnte eine globale map<void*, int> sein, wobei der Schlüssel der Zeiger auf eine Speicherzuweisung ist und der Wert die Größe dieser Zuordnung ist. Es gibt viele andere Möglichkeiten, in denen delete[] die Größe herausfinden kann. Der C++ - Standard gibt nicht an, welcher verwendet werden soll. Es sagt nur, dass delete[] muss die Größe wissen, und überlässt es den Implementierern, herauszufinden wie, um es abzuziehen.

+0

Wo ist die Implementierung des Mechanismus des Paares: löschen und neu? –

+0

in der Laufzeitbibliothek, die normalerweise mit dem Compiler bereitgestellt wird. – jalf