2010-10-25 18 views
8

He overloadded nueva [] como estoC++ consulta nueva sobrecargada []: ¿Qué tamaño toma como parámetro? operador

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

y ahora llamando

human * h = new human[14] ; 

dicen sizeof(human) = 16, pero cuentan que se imprime es 232, que es 14 * 16 + sizeof (int *) = 224 +8.

¿Por qué se asigna este espacio adicional? ¿Y dónde cae en la memoria? Porque cuando imprimo *h O h[0] obtengo los mismos resultados, por lo que no está en el comienzo del fragmento de memoria. ¿Es correcto en absoluto O me falta algo aquí?

+1

Buena pregunta. Sin embargo, el nítido dentro de mí necesita señalar que no se verifica que malloc() devuelva un puntero nulo. – sharptooth

+0

@sharptooth: está bien, pero eso fue intencional porque quería centrarme en la pregunta real y no agregar demasiados ifs. Idealmente, uno debe verificar la temperatura. = 0 else arrojar alguna excepción (bad_alloc un poco) –

+0

Los bytes adicionales son para almacenar la cantidad de bytes asignados. Pero donde almacena depende de la implementación. – bjskishore123

Respuesta

6

El espacio adicional asignado se utiliza para almacenar el tamaño de la matriz para uso interno (en la práctica para que delete[] sepa cuánto eliminar).

Se se almacenan en el comienzo de la gama de la memoria, inmediatamente antes de &h. Para ver esto, solo mira el valor de temp dentro de tu operator new[]. El valor será diferente al de &h.

3

Es para almacenar el número de objetos asignados para que cuando invoque delete[] se elimine el número adecuado de objetos. Vea esto FAQ para más detalles.

Cuestiones relacionadas