2010-10-25 9 views
8

ho overloadded nuovo [] come questoC++ overloaded new [] query: quale dimensione prende come parametro? operatore

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

e ora chiamando

human * h = new human[14] ; 

dicono sizeof(human) = 16, ma conta la stampa è 232, che è 14 * 16 + sizeof (int *) = 224 +8.

Perché viene assegnato questo spazio aggiuntivo? E dove cade nella memoria? Perché quando stampo *h O h[0] ottengo gli stessi risultati, quindi non è all'inizio del frammento di memoria. È corretto O mi manca qualcosa qui?

+1

Buona domanda. Eppure il nitpicker dentro di me deve precisare che non si controlla che malloc() restituisca un puntatore nullo. – sharptooth

+0

@sharptooth: giusto ma è stato intenzionale perché volevo concentrarmi sulla vera domanda e non aggiungere troppe ifs :) Idealmente, è necessario controllare temp! = 0 altrimenti lanciare qualche eccezione (bad_alloc kinda) –

+0

I byte extra servono per la memorizzazione il numero di byte assegnati. Ma dove memorizza dipende dall'implementazione. – bjskishore123

risposta

6

Lo spazio aggiuntivo allocato viene utilizzato per memorizzare la dimensione dell'array per uso interno (in pratica in modo che delete[] sappia quanto cancellare).

E è memorizzato all'inizio del l'intervallo di memoria, subito prima di &h. Per vedere questo, basta guardare il valore di temp all'interno del tuo operator new[]. Il valore sarà diverso da quello in &h.

3

Memorizza il numero di oggetti allocati in modo che quando si richiama il numero corretto di oggetti delete[] si eliminino. Vedi questo FAQ per maggiori dettagli.