2010-12-14 29 views

Respuesta

23

Respuesta simple Nº

Delphi no es un completo lenguaje de recolección de basura, tipos definidos por el usuario se deben asignar y desasignar manualmente. Solo proporciona recolección automática, para algunos tipos incorporados, como cadenas, matrices dinámicas e interfaces para facilitar su uso.

Pero puede usar interfaces que utilizan el recuento de referencias para la recolección de basura hasta cierto punto.

+6

También vale la pena mencionar que todo lo que se deriva de TComponent toma un puntero de propietario a través del constructor, lo que hace que el objeto se destruya junto con su propietario. –

+0

basura delphi recoge algunos tipos de datos, como matriz dinámica, cadena. –

+0

Delphi está familiarizado con ARC (conteo automático de referencias), una forma de administrar el tiempo de vida de las interfaces (implementación de RefCount) y otros tipos. Hoy en día, el compilador móvil Delphi más nuevo ha introducido ARC a los objetos. Está controlado por una directiva de compilación "{$ AUTOREFCOUNT}". Ver el enlace a continuación: http://docwiki.embarcadero.com/RADStudio/Tokyo/en/Automatic_Reference_Counting_in_Delphi_Mobile_Compilers – Lucas

6

En el sentido habitual de la recolección de basura, donde el tiempo de ejecución detecta objetos sin referencia y los destruye o recupera recursos no utilizados, no, Delphi no tiene recolección de basura.

Si usa Win32 Delphi nativo, lo más cercano que tiene a la recolección de elementos no utilizados son los distintos tipos de referencias contadas, incluidas cadenas, interfaces, variantes y matrices dinámicas. Esos tipos se limpiarán automáticamente cuando su programa determine que ya no se usan, pero lo hace al mantener un recuento de referencias cuando esos objetos ingresan y abandonan el alcance actual. También tiene el concepto de propiedad , que destruirá los componentes de propiedad cuando el propietario se destruye.

Si utiliza Delphi para .Net, entonces implícitamente tiene la colección de elementos no utilizados del tiempo de ejecución subyacente.

+2

Delphi.NET está muerto desde hace más de 2 años –

+5

Sí, @User, y como Delphi 7 tiene una década de antigüedad, debe estar muerto, también. Además, el lenguaje Delphi sigue estando disponible para .Net a través de Prism. –

+3

Prism ni siquiera intenta compartir fuente, por lo que no veo exactamente como una continuación. Excepto por la marca registrada. –

17

Sí, lo hace.

Delphi Win32 no incluye un recolector de basura fuera de la caja por lo que las otras respuestas a esta pregunta son técnicamente correctas. Sin embargo, esto no implica que no sea posible o que uno no exista ya. Gracias al gestor de memoria reemplazable de Delphi Barry Kelly implementado un completo y funcional para el wrapperBoehm garbage collector en 2004.

Incluye código de ejemplo que demuestra su uso (básicamente la creación de objetos no asignados y viendo la GC ellos masticar). Hay GC más avanzados que el Boehm GC, pero esto demuestra claramente que es posible y se puede usar casi de forma transparente. Simplemente agregue la unidad gc al principio de la cláusula de usos de su proyecto.

Y si bien no he oído hablar de ningún proyecto que lo intente, no hay nada que impida que alguien envuelva o transfiera un gc más avanzado.

2

Delphi Prism-

tiene Recolección de basura, ya que se basa en .NET

Delphi estándar (Win32 nativo)

Flexible No tiene Recolección de Basura

1

Delphi Win32/64 no tiene un recolector de basura. Sin embargo, puede aprovechar el mecanismo de conteo de referencias nativas de Delphi para que las instancias se liberen automáticamente mediante el uso de interfaces.

Las diferencias entre un recolector de basura y un mecanismo de recuento de referencias es que tendrá que tratar con referencias circulares, es decir, si las instancias A y B se referencian, debe romper manualmente el ciclo para A o B. .