Frage

Ist es wahr, dass ein Zeiger auf die Startadresse eines dynamisch zugewiesenen Array zugeordnet nicht die Informationen über die Größe des Arrays hat? Also haben wir eine weitere Variable zu verwenden, haben ihre Größe zu speichern, für die spätere Verarbeitung der Anordnung durch den Zeiger.

Aber wenn wir die dynamisch zugewiesenen Array frei, wir die Größe nicht angeben, sondern wir nur „freien ptr“ oder „delete [] ptr“. Wie konnte die Größe des Arrays befreien oder löschen wissen? Können wir das gleiche Schema verwenden in einer anderen Variable Speicher die Größe des Arrays zu vermeiden?

Danke!

War es hilfreich?

Lösung

Ja, das ist wahr.

delete kennt die Größe des Speicher chunk weil new zum Brocken zusätzliche Informationen hinzufügt (in der Regel vor der Bereich an den Benutzer zurückgegeben), seine Größe enthält, zusammen mit anderen Informationen. Beachten Sie, dass dies alles sehr viel Implementierung spezifisch und nicht von Ihrem Code verwendet werden soll.

So Ihre letzte Frage zu beantworten: Nein - wir können es nicht verwenden - es ist eine Implementierung Detail, die hoch-Plattform und Compiler abhängig.


Beispiel in der Probe Speicherzuordner gezeigt in K & R2, ist dies die "Header" platziert vor jeder Chunk zugeordnet:

typedef long Align; /* for alignment to long boundary */

union header { /* block header */
  struct {
    union header *ptr; /* next block if on free list */
    unsigned size; /* size of this block */
  } s;

  Align x; /* force alignment of blocks */
};

typedef union header Header;

size ist die Größe des zugeordneten Block (die dann von free verwendet wird, oder delete).

Andere Tipps

Das Komische ist, dass historisch gesehen war es delete [20] arr; wie es arr = new int[20] ist. Doch die Praxis bewährt, dass die Informationen über Größe schmerzarm durch den allocator gespeichert werden, und da die meisten Leute, die es dann sowieso gespeichert, es wurde in den Standard aufgenommen.

Was ist lustig, und wenig bekannt ist, ist die Tatsache, dass diese „erweiterte Lösch-Syntax“ in der Tat von einigen C ++ Compiler unterstützt wird (trotz nicht mehr korrekt sind, auch angesichts der C ++ 98-Standard), obwohl keiner verlangen es.

int* arr = new int[20];
delete [20] arr;

Der traurige Teil über all dies ist jedoch, dass es keine Standard-konforme Art und Weise, die vergangene Größe für den eigenen Gebrauch abgerufen werden: - /

Es ist wahr, dass das Array enthält nicht die Größe des Arrays, haben Sie zu speichern, die Informationen für später. Wenn ein Array durch delete free oder Löschen ist der Zeiger auf den zugewiesenen Speicher Sie übergeben. Der Speichermanager (entweder vom System oder eine eigene überschreiben neu und löschen) kennt den Speicherbereich verwendet, die freigegeben wird, und verfolgt sie. Hoffe, es macht Sinn.

Ja, es ist wahr. Dies ist Teil, warum sollten Sie nur selten mit dieser direkt zu behandeln versuchen, und einen Standard-Container stattdessen verwenden. Über die einzige Zeit ist es sinnvoll mit ihr umgehen, wenn Sie ist zu entscheiden, einen Container selbst zu implementieren (in diesem Fall, dass Sie normalerweise die Größeninformationen verfolgen werden bei der Umsetzung Ihres Containers).

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