manejo - Tamaño C++ de memoria dinámica en tiempo de ejecución
memoria dinamica caracteristicas (1)
Cuando se realiza una asignación, una pequeña sección de memoria inmediatamente anterior [o, técnicamente, en algún lugar completamente diferente, pero justo antes es el escenario más común] almacenará el tamaño de la asignación, y en el caso de los new []
también almacenará el cantidad de objetos asignados
Tenga en cuenta que el estándar de C ++ no ofrece ninguna forma de recuperar esta información por un motivo: puede que no describa con precisión lo que se asigna, por ejemplo, el tamaño de una matriz puede redondearse a un límite "bueno" [casi todos] asignadores modernos redondos a 16 bytes como mínimo, para que la memoria se pueda usar para SSE y otras implementaciones SIMD similares en otras arquitecturas de procesador]. Entonces, si asignó 40 bytes, reportaría 48, que no es lo que pidió, por lo que sería bastante confuso. Y, por supuesto, no hay garantía de que la información se almacene en TODO. Puede estar implícita en otra información almacenada en el bloque "admin" de la asignación.
Y, por supuesto, puede usar la ubicación new
, en cuyo caso no hay un bloque de administración, y la asignación no se elimina de la manera normal; algunos códigos arbitrarios no podrían diferenciar.
delete
difiere de delete []
en que delete []
sabrá cuántos objetos se han asignado, y llama al destructor para todos esos objetos. También es posible [o incluso probable] que new []
almacene la cantidad de elementos de una manera que signifique que llamar a delete []
en algo que no fue creado con new []
saldrá horriblemente mal.
Y como comentó Zan Lynx, eso si no hay un destructor para los objetos (por ejemplo, cuando está asignando datos para int
o struct { int x; double y; }
, etc., incluidas las clases que no tienen un constructor [tenga en cuenta que si tiene otra clase dentro de la clase, el compilador creará un destructor para usted]), entonces no hay necesidad de almacenar el conteo, o hacer cualquier otra cosa, por lo que el compilador PUEDE, si lo desea, optimizar este tipo de asignación en regular new
y delete
.
Esto es algo que me he estado preguntando por un tiempo y nunca he encontrado una respuesta para:
¿Por qué cuando asignas algo en el montón no puedes determinar su tamaño solo con el puntero, pero puedes eliminarlo solo con el puntero y de alguna manera C ++ sabe cuántos bytes liberar?
¿Tiene esto algo que ver con la forma en que está almacenado en el montón? ¿Esta información está allí pero no está expuesta por C ++?
Y tal vez esta debería ser una pregunta separada, pero creo que está muy relacionada, así que la preguntaré aquí:
¿Por qué se debe eliminar una matriz dinámica de elementos utilizando delete []
en lugar de solo el comando de delete
simple? ¿Por qué C ++ necesita esta información adicional para liberar correctamente toda la memoria?