Frage

Ich habe ein Beispiel für die Verwendung der Funktion gesehen: Löschen in CPP und habe es nicht vollständig verstanden. Der Code ist:

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 Aktion des Befehls: delete[] p;?

Ich denke, das Ziel war es, alle Zeiger im Containertisch zu löschen.

Die Klammern delete[] Geben Sie mir einen Hinweis, dass es eine Reihe von Zeigern löscht, um zu nennen, aber die Größe des Arrays ist nicht angegeben. Woher "weiß", wie viele Zeiger löschen?

War es hilfreich?

Lösung

delete Ist es keine Funktion, es ist ein Bediener.

EIN delete Ausdruck verwendet [] zerstört Objekte mit mit new ... [] und veröffentlicht den zugehörigen Speicher. delete[] muss für Zeiger verwendet werden, die von zurückgegeben werden new ... []; Nicht-Array delete Nur auf Zeiger, die von Nicht-Array zurückgegeben wurden new. Verwenden der Nichtübereinstimmung delete Form ist immer falsch.

Das delete Ausdruck in ~Table() (fehlen () in Ihrem Code) zerstört das dynamisch erstellte Array von Name Objekte sicherstellen, dass die Name Destructor ist für jedes Mitglied des Arrays aufgefordert.

Es geht um die Implementierung, um einige Mechanismus zur Aufzeichnung der Anzahl der Elemente in Arrays zu implementieren new ... [] Der Programmierer muss sich darüber keine Sorgen machen.

In vielen Implementierungen, in denen die Array-Elemente nicht triviale Zerstörer haben, a new[] Der Ausdruck bereitstellt zusätzlichen Platz, um die Elementzahl vor dem Platz für alle Array -Mitglieder aufzuzeichnen. Diese versteckte Anzahl wird dann aufgeschaut, wenn delete[] wird verwendet, um sicherzustellen, dass die korrekte Anzahl von Zerstörern aufgerufen wird. Dies ist jedoch nur ein Implementierungsdetail, andere Implementierungen sind möglich.

Andere Tipps

Zusamenfassend, delete[] Kennt die Größe des Arrays, das es löscht, weil es erforderlich ist.

Weil der C ++ - Sprachstandard feststellt, dass es wissen muss. Wenn Sie also ein Array zuordnen, ist es dem System, die Größe irgendwo zu speichern, wo delete[] kann es finden.

Eine Möglichkeit besteht darin, ein paar Bytes mehr als nötig zuzuweisen. Verwenden Sie die ersten Bytes, um die Größe anzugeben. Wenn Sie dann einen Zeiger an das erste zugewiesene Byte zurückgeben, geben Sie einen Zeiger an das erste Byte zurück, um das Feld der Größen zu erhalten.

Dann delete[] Ich muss nur einige Bytes vom Zeiger abziehen, um die Größe zu finden.

Eine andere Option könnte sein, eine globale zu haben map<void*, int>, wo der Schlüssel der Zeiger auf eine Speicherzuweisung ist und der Wert die Größe dieser Zuweisung ist. Es gibt viele andere Möglichkeiten, mit denen delete[] kann die Größe herausfinden. Der C ++ - Standard gibt nicht an, welche sie verwendet werden sollen. Das sagt das nur delete[] muss die Größe kennen und den Implementierern überlassen, herauszufinden wie Um es abzuziehen.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top