new operator
-
hola leute
wie funktioniert das eigendlich mit dem new-operator ?
wenn ich ein mir ein array bastel,
char *c_array = new char[120 * name_string_len];
dann muss der comiler ja die groesse irgendwo abspeichern, damit er beim aufruf von delete[] weiß, wieviel er freigeben muß.
wo wird das abgespeichert ?
hab mir mal die vorderen 4 byte vor dem array angeguckt. dafuer hab ich mir 5 arrays angelegt, mit der gleichen groesse.
das ergebnis:
bei feldgroessen 1 bis 8 stand vor den arrays immer die zahl (unsigned int)14.
bei "---------" 9 bis 12 " - - - - - - - - -" 18
ab feldgroesse 13 kam dann 22 usw.
und das vor jedem array. extremer zufall ? oder mit absicht vom compiler ?Meep Meep
-
Meep Meep schrieb:
wo wird das abgespeichert ?
Überall und nirgendwo... Ist nicht definiert und es gibt keine, laut C++ Standard korrekte, Möglichkeit das rauszubekommen. Darum muss man sich die Größe selber im Programm abspeichern.
-
Wie schon von DrGreenthumb gesagt, gibt es keine C++ Methode. Allerdings ist es üblich ,dass die 4 Bytes direkt vor dem allockirtem Speicher dazu benutzt werden. Also:
#include<iostream> using namespace std; int main(){ int*a=new int[10]; cout<<*(a-1)<<endl; system("pause"); return 0; }
wird oft (das nicht mit jedem Compiler und OS) 40 ausgeben.
Fals du Win32 nutzt und dein Kompiler die Heap Funktionen nutzt dann ist es so. Allerdings ist die Mindestgrösse 12. Also:
int*p=new int;
ist eigendlich equivalent zu:
int*p=new int[3];
Deshalb kommt es vor, dass wenn man unter Win32 ein 8 byte langer char Array anlegt und dann den Border überschreibt man keine Probleme bekommen kann weil man noch unter der 12 Byte Grenze ist. Nach einer Protirung kann es dann sein, dass das Program einbahnfrei kompiliert aber eigenartige Fehler at runtime auftauchen.
Allerdings wie schon gesagt wenn du die Grösse wissen musst dann mach dir eine Variable die den Wert enthält.
-
Hallo,
einige Compiler verwenden auch ein assoziatives Array. Der gelieferte Pointer dient dabei als Schlüssel. In diesem Fall wird also kein extra Speicher vor dem eigentlichen reserviert.Neben der Größe des Blocks muss der Compiler außerdem wissen, wieviele Objekte das Array hat. Schließlich müssen genau soviele Destruktoren aufgerufen werden. Die Objektanzahl muss allerdings nicht unbedingt gespeichert werden, da der Compiler sie aus dem Typ der Elemente des Arrays und deren Alignment-Requirements ableiten kann.
-
Neben der Größe des Blocks muss der Compiler außerdem wissen, wieviele Objekte das Array hat. Schließlich müssen genau soviele Destruktoren aufgerufen werden. Die Objektanzahl muss allerdings nicht unbedingt gespeichert werden, da der Compiler sie aus dem Typ der Elemente des Arrays und deren Alignment-Requirements ableiten kann.
Wird aber oft, weil Compiler meistens auf bereits vorhandene OS Funktionen zurück greifen und die bei der Grösse auch mal etwas mehr als gefragt geben. Allerdings ist es oft so, dass die Anzahl nur gespeichert wird fals die Klasse ein Destruktor hat, denn fals nicht dann stellt sich die Frage erst gar nicht.