2010-10-25 9 views
8

Ich habe neue overloadded Operator [] wie folgtC++ überladen neue [] Abfrage: Welche Größe braucht es als Parameter?

void * human::operator new[] (unsigned long int count){ 
     cout << " calling new for array with size = " << count << endl ; 
     void * temp = malloc(count) ; 
     return temp ; 
} 

und jetzt

human * h = new human[14] ; 

sagen sizeof(human) = 16 nennen, aber zählen druckt es ist 232, die 14 * 16 + sizeof (int *) = 224 +8.

Warum wird dieser zusätzliche Speicherplatz zugewiesen? Und wo fällt es in Erinnerung? Weil, wenn ich *h ODER h[0] drucke, bekomme ich die gleichen Ergebnisse, so ist es nicht im Anfang des Speicherstücks. Ist es überhaupt richtig ODER fehlt mir hier etwas?

+1

Gute Frage. Doch der Nitpicker in mir muss darauf hinweisen, dass Sie nicht nach malloc() suchen, das einen Nullzeiger zurückgibt. – sharptooth

+0

@Sharptooth: ur richtig, aber das war absichtlich coz ich wollte auf echte Frage konzentrieren und nicht zu viele Wenns :) Idealerweise muss man auf temp zu überprüfen! = 0 sonst werfen einige Ausnahmen (bad_alloc irgendwie) –

+0

Extra-Bytes sind zum Speichern die Anzahl der zugewiesenen Bytes. Aber wo es speichert ist abhängig von der Implementierung. – bjskishore123

Antwort

6

Der zusätzliche Speicherplatz wird verwendet, um die Größe des Arrays für die interne Verwendung zu speichern (in der Praxis, so dass delete[] weiß, wie viel zu löschen).

Es ist am Anfang des Speicherbereichs gespeichert sind, sofort vor&h. Um dies zu sehen, sehen Sie sich einfach den Wert temp in Ihrem operator new[] an. Der Wert unterscheidet sich von dem in &h.

3

Es ist die Anzahl der Objekte zu speichern, so dass beim Aufrufen von delete[] die richtige Anzahl von Objekten gelöscht werden. Siehe hierzu FAQ für weitere Details.