Delphi gestiona automáticamente la memoria
Las variables atómicas en Delphi, como enteros, booleanos, registros, enumeraciones, etc., el compilador asigna automáticamente la memoria dentro del alcance y las libera automáticamente cuando está fuera del alcance. Además, las cadenas, variantes, matrices dinámicas e interfaces. También son gestionados automáticamente por Delphi.
Todas estas variables se almacenan en la pila , excepto las interfaces. Además, los programadores crean manualmente Variant utilizando funciones, como VarArrayCreate; las matrices dinámicas también las crean manualmente los programadores utilizando funciones, como SetLength, pero en ambos casos, los programadores no necesitan publicarlas ellos mismos.
Además, hay otro tipo de variable a tener en cuenta, que es una variable declarada usando Threadvar y su alcance es un hilo. Esto se usa principalmente al escribir funciones de subprocesos para que cada subproceso use un almacenamiento local de subproceso.
Memoria gestionada manualmente por programadores.
Los punteros y los objetos requieren que los programadores soliciten y liberen memoria manualmente.
Los punteros incluyen PChar, puntero (puntero sin tipo), puntero de registro, puntero de variable (que apunta a una variable atómica), puntero de función (como una función de devolución de llamada, dividida en funciones globales y métodos de objeto). Utilice la función Nuevo para solicitar memoria y utilice Dispose para liberar el puntero. Además, GetMem, ReallocMem y FreeMem también son una serie de funciones para solicitar y liberar memoria. Puede leer y configurar las tres funciones de administración de memoria de Delphi a través de las funciones GetMemoryManager y SetMemoryManager.
Los objetos incluyen objetos de subclase heredados de dos árboles de herencia, TObject e IUnknown. Los objetos deben construirse utilizando métodos constructores. Si no especifica un propietario para un objeto creado usando un método constructor (generalmente Crear, pero puede que no sea el caso; el compilador de Delphi solo reconoce la palabra clave del constructor), debe liberarlo usted mismo incluso si especifica un propietario. aún necesita verificar la situación real. Debe publicarse en un momento específico. Generalmente, se usa el método Free para la liberación (IUnknown no requiere liberación manual). Un mejor método es usar FreeAndNil (en la unidad Sysutils.pas), que no solo libera la memoria ocupada sino que también libera el puntero.
Estas variables se almacenan en el montón . Otro problema que requiere atención es que los punteros en TList deben ser liberados por el propio programador.
Nota:
1. La función de devolución de llamada no pertenece al alcance técnico de la administración de memoria. Para obtener más información, consulte la sección "Puntero".
2. Para obtener detalles sobre el objeto, consulte la sección "Modelo de objetos".
3. Si se usa un puntero en varios lugares y se libera uno de los lugares, se producirá una excepción si se usa en otros lugares. Este es un problema al que se debe prestar atención al usar punteros. Para obtener información detallada sobre la memoria, consulte la sección "Puntero".
4. Pasar punteros tiene dos ventajas obvias: ahorra memoria y mejora la velocidad. Para obtener información detallada sobre la memoria, consulte las secciones "Consejos" y "Consejos de diseño".
5. Cómo juzgar objetos y punteros es un tema muy técnico. Hay algunas publicaciones sobre este tema en csdn. También puede ver un artículo escrito por Aimingoo ([email protected]) titulado "Acerca de" Cómo detectar si un puntero. es el artículo "Discusión en profundidad del objeto". Para obtener información detallada sobre la memoria, consulte las secciones "Puntero" y "Objeto".
Completado el 19 de enero de 2004 .
Todos los derechos reservados. No dude en corregir cualquier comentario inapropiado.