Parecería que el tamaño de un bloque referenciado por un puntero devuelto por GetMem() debe estar disponible desde algún lugar, dado que FreeMem() no requiere que identifique el tamaño de la memoria que se liberará: el sistema debe ser capaz de determinarlo, ¿por qué no el desarrollador de la aplicación?
Pero, como han dicho otros, los detalles precisos de la gestión de la memoria implicada NO están definidos por el sistema per se ....Delphi siempre ha tenido una arquitectura de administrador de memoria reemplazable, y la "interfaz" definida para los administradores de memoria compatibles no requiere que proporcionen esta información para un puntero arbitrario.
El administrador de memoria predeterminado mantendrá la información necesaria de la forma que se adapte a él, pero algún otro administrador de memoria utilizará un mecanismo totalmente diferente, aunque superficialmente similar, incluso si piratea una solución basada en el conocimiento íntimo de un administrador de memoria, si cambia el administrador de memoria (o si se cambia para usted, por ejemplo, por un cambio en el sistema definido, administrador de memoria que tal vez esté usando por defecto, como ocurrió entre Delphi 2005 y 2006, por ejemplo), entonces su la solución casi con certeza se romperá.
En general, no es una suposición razonable por parte del gestor de memoria/RTL que la aplicación ya debe saber el tamaño de un trozo de memoria que un GetMem() puntero asignado refiere, dado que la aplicación pidió en primer lugar! :)
Y si su aplicación NO asignó el puntero entonces el administrador de memoria de su aplicación no tiene manera de saber qué tan grande puede ser el bloque al que hace referencia. Puede ser un puntero al medio de un bloque más grande, por ejemplo, ¡solo la fuente del puntero puede saber cómo se relaciona con la memoria a la que hace referencia!
Pero, si la aplicación realmente necesita para mantener dicha información al respecto es propios punteros, entonces podría, por supuesto, diseñar fácilmente un medio para lograr esto con una clase Singleton simple o biblioteca de funciones a través del cual GetMem()/FreeMem() las solicitudes se enrutan para mantener un registro del tamaño solicitado asociado para cada puntero asignado actualmente. Tal mecanismo podría, por supuesto, exponer fácilmente esta información según sea necesario, de manera totalmente confiable e independiente de cualquier administrador de memoria que esté en uso.
Esto puede ser la única opción si se requiere un registro "preciso", ya que una implementación determinada del administrador de memoria puede asignar un bloque de memoria mayor para un tamaño de datos determinado que el solicitado. No sé si algún administrador de memoria lo hace, pero podría hacerlo en teoría, por razones de eficiencia.
relacionado: http://stackoverflow.com/questions/969007/is-it-possible-to-get-the-size-of-the-type-that-a-pointer-points-to-in-delphi -7/http://stackoverflow.com/questions/232691/how-can-i-get-the-size-of-an-array-from-a-pointer-in-c –