Recuerde que C++ separa asignación de memoria y objeto de expresión. La nueva matriz predeterminada-T * p = new T[N];
asigna memoria suficiente para los objetos N
y construye esos objetos. En el otro extremo, delete[] p;
debe llamar al destructor de todos esos elementos y luego liberar la memoria.
Mientras que la asignación y liberación de la memoria es manejada por la plataforma, y la memoria libre está suficientemente identificada al sistema operativo por un único valor de puntero, la construcción y destrucción de objetos es más complicada. El número de objetos reales debe almacenarse en algún lugar, y para ese fin, el estándar permite que una implementación de C++ solicite más memoria que N * sizeof(T)
. Es cierto que el puntero p
siempre apuntará al comienzo de la matriz de objetos N
, pero p
no tiene que ser el mismo puntero devuelto por el asignador de memoria subyacente. (De hecho, p
se garantiza que es precisamente el valor del resultado de asignación subyacente compensado por la cantidad excesiva de memoria).
Los detalles se dejan completamente a la implementación.Sin embargo, algunas plataformas brindan garantías adicionales; Por ejemplo, el Itanium ABI (que llama a los datos adicionales "matriz cookie") dice que se presentó a la memoria para new T[N]
de la siguiente manera:
+- alignof(T) --+-- sizeof(T) --+-- sizeof(T) --+-- sizeof(T) --+-- ...
| ***** [8B: N] | 1st element | 2nd element | 3rd element | .....
+---------------+---------------+---------------+---------------+-- ...
A A
| |_ result of "new T[N]"
|
|_ value returned "operator new[]()"
Es esta una pregunta tarea? – templatetypedef
es un poco mi propia tarea. :) – sof
¿Cómo se mide la cantidad de memoria asignada? –