Wie löscht [] die Größe eines Arrays?

8
  

Mögliche Duplikate:
Wie funktioniert der neue Standardoperator in C ++?
Wie löscht []" die Größe des Operandenarrays?

Dupe von Wie löscht [] "know "Die Größe des Operandenarrays?

Ich bin gespannt, wie delete [] die Größe des zugewiesenen Speichers ermittelt. Wenn ich etwas mache wie:

%Vor%

Ich verstehe, dass die Erinnerung an die Tabelle frei ist. Aber was würde passieren, wenn ich den Zeiger einer anderen Tabelle neu zuordnen würde.

%Vor%

Werde ich eine Tabelle der Größe 5 oder 9 freigeben? Ich bin daran interessiert, wie new [] und delete [] Informationen über ihre Größe teilen. Oder vielleicht fehlt mir hier etwas Wesentliches.

    
Lucas 10.06.2009, 14:00
quelle

8 Antworten

10

Es würde ein Array der Größe 9 löschen. Es löscht das Array, auf das der Zeiger zeigt.

Es ist nicht spezifiziert, wie die Größeninformation gespeichert wird, so dass jeder Compiler es auf eine andere Art und Weise implementieren kann, aber ein üblicher Weg ist es, einen zusätzlichen Block vor dem Array zuzuweisen. Das heißt, wenn Sie dies tun:

%Vor%

Es weist tatsächlich ein Array von 6 Ganzzahlen zu und speichert die Array-Größe im ersten Element. Dann gibt es einen Zeiger auf das zweite Element zurück. Um die Größe zu finden, muss delete [] einfach nur Tabelle [-1] lesen.

Das ist ein gängiger Weg, aber der Sprachstandard gibt nicht vor, dass auf diese Weise gemacht werden muss. Nur dass es funktioniert .

Ein anderer Ansatz könnte darin bestehen, die Adresse des Arrays als Schlüssel in einer globalen Hash-Tabelle zu verwenden. Jede Methode ist gültig, solange sie die richtigen Ergebnisse liefert.

    
jalf 10.06.2009, 14:05
quelle
16

Abschnitt 16.14 der C ++ - FAQ lite beantwortet dies:

  

Es gibt zwei beliebte Techniken, die   mach das. Beide Techniken sind in   Verwendung von kommerziellen Compilern,   beide haben Kompromisse, und keines von beiden   perfekt. Diese Techniken sind:

%Vor%
    
Doug T. 10.06.2009 14:04
quelle
4

Wie das gemacht wird, ist ein kompilerspezifisches Detail. Aber der Aufruf zum Löschen von [], der keine Speicherbeschädigung annimmt, löscht immer die richtige Anzahl von Elementen. Es gibt mehrere Möglichkeiten, dies zu erreichen, aber eine einfache Möglichkeit besteht darin, die Länge im Speicher zu verbergen.

Hier ist eine schöne und einfache Möglichkeit, dies zu Demonstrationszwecken zu implementieren. Sagen Sie, Ihr Code ruft new int [10] auf. Anstatt 10 * sizeof (int) zuzuweisen, weist der Compiler (10 * sizefo (int)) + sizeof (size_t) zu. Es gibt dann einen Zeiger auf Sie zurück, der Offset size_t von Anfang an hat. Innerhalb dieses ersten Platzes size_t schreibt es die Zahl 10. Wenn Sie nun delete [] aufrufen und einen Zeiger übergeben, geht der Compiler einfach rückwärts size_t bytes und findet die Anzahl der zu löschenden Elemente.

    
JaredPar 10.06.2009 14:05
quelle
2

Wie delete [] funktioniert, ist implementierungsabhängig, aber der globale neue Operator ordnet einen Deskriptor dem zugewiesenen Speicher auf irgendeine Weise zu (in den meisten Fällen wird er dem zugewiesenen Speicher vorangestellt oder in einer Nachschlagetabelle gespeichert). Der Deskriptor enthält die tatsächliche Größe des Speichers, der zugewiesen wurde.

In Ihrem zweiten Codebeispiel löscht delete [] das neun Elemente umfassende Array von int, und das ursprüngliche Array mit fünf Elementen wird durchgesickert.

    
MattK 10.06.2009 14:07
quelle
1

Der Mechanismus ist implementierungsabhängig, wird aber nicht "getäuscht", wenn Sie den Zeiger in Ihrem Beispiel neu zuweisen. Es wird das Array der Größe 9 freigeben, genau wie du es ihm gesagt hast (und in diesem Fall wird es einen Speicherverlust geben, da das Array der Größe 5 jetzt nichts mehr darauf hinweist).

    
Matthew Flaschen 10.06.2009 14:06
quelle
0

Ich nehme an, dass new [] tatsächlich mehr Daten zuweist als es scheint. Es hat wahrscheinlich ein paar Bytes vor dem zurückgegebenen Zeiger, der angibt, wie viele Elemente im Array sind.

    
Robert 10.06.2009 14:05
quelle
0

Sie können sich vorstellen, dass das System die Größe der Tabelle in einer Struktur wie dieser speichert:

%Vor%

Geben Sie bei jeder Speicherzuweisung einen Zeiger auf 'yourData' ein. Und bei jedem Typ ist Ihr Speicher "frei", das System verschiebt den Zeiger, um das "sizeOfMemory" zu erhalten. Siehe auch std :: allocator

    
Pierre 10.06.2009 14:08
quelle
0

im neuen Fall [] / delete [], was memory-weise geschieht, ist gleich / ähnlich dem, was in new / delete case passiert ... die Größeninformation wird innerhalb des (größeren) zugewiesenen Blocks selbst gespeichert. Was für Arrays interessant ist, ist, dass es auch die Größeninformationen verwendet, um zu wissen, wie viele Objekte Destruktoren aufgerufen werden sollen.

    
mhk 24.03.2013 13:12
quelle

Tags und Links