2012-05-04 27 views
6

¿Está garantizado que el nuevo operador asigna un trozo continuo de memoria de montón? Es decir. esNuevo operador de C++ - diseño de memoria

objects=new Base[1024]; 

en términos de asignación de memoria lo mismo que

objects=(Base*)malloc(1024*sizeof(base)); 

o puede haber lagunas?

Respuesta

8

Sí, la memoria será continua. En términos de asignación, es lo mismo que la versión malloc, pero hay varias diferencias (llamadas al constructor, new no devuelve NULL, malloc no arroja excepciones, etc.`).

Tenga en cuenta que no se puede mezclar con new[]delete o free, usted tiene que utilizar delete[] objects para liberar la memoria.

+0

No es exactamente lo mismo. La 'nueva []' versión llamará al constructor predeterminado en cada objeto. –

+1

@ edA-qamort-ora-y eso es lo que dije ... –

+0

Lo siento, estoy ciego hoy supongo. Sin embargo, la nueva versión asignará un poco más de espacio para recordar el tamaño de la matriz para que 'delete []' pueda llamar al número correcto de destructores. Por supuesto, es una pequeña diferencia en el espacio. –

3

Quizás. El operador new hace dos cosas: llama a la función operator new, que devolverá un bloque contiguo de memoria, alineado adecuadamente para todos los tipos posibles (excepto cuando no lo hace, por ejemplo, un emplazamiento incorrecto nuevo); luego llama al constructor del objeto, que puede hacer casi cualquier cosa. Incluyendo la asignación de bloques adicionales, que no serán contiguos al primero.

0

Si el operador new no está sobrecargado, sí, el bloque asignado de memoria es contiguo. Pero si está sobrecargado, no podemos saber (¿algunos programadores malvados podrían haberlo sobrecargado?: D)

Cuestiones relacionadas