2010-11-26 17 views
7

Una pregunta muy simple:¿Estoy creando una pérdida de memoria aquí?

type 

TMyRecord = Record 
    Int: Integer; 
    Str: String; 
end; 

PMyRecord = ^TMyRecord; 

var 
    Data: PMyRecord; 
begin 
    New(Data); 
    Data.Int := 42; 
    Data.Str := 'Test'; 
    Dispose(Data); 
end; 

Mi pregunta es, ¿Estoy creando una pérdida de memoria aquí (con la cadena)? Debería llamar a Data.Str: = ''; antes de llamar ¿Desechar?

Gracias!

+0

No lo creo. –

Respuesta

12

No, Dispose correctamente libera cadenas y matrices dinámicas en los registros, incluidos los anidados. GetMem/FreeMem (Data) crearía una memoria puerro, de hecho.

+3

Agregue variantes, interfaces contadas de referencia y quizás incluso funciones anónimas a la lista, creo que todo lo que es referencia contada se libera en 'Dispose()'. – Trinidad

+2

GetMem/FreeMem requeriría llamar a Finalize(). Marque Finalize en la ayuda para obtener una explicación sobre lo que hace cuando no se puede usar Dispose(). –

+3

@ldsanson: New = GetMem + Initialize y Dispose = Finalize + FreeMem - comprueba System.pas. Esos son solo envoltorios para ambas funciones. –

0

No, no lo es, String limpia su propia memoria cuando se elimina.

+2

En realidad: las cadenas se liberan cuando se finaliza la estructura global. –

0

Si desea una pérdida de memoria, que yo sepa lo que tiene que utilizar objetos TP :-) Son los únicos que yo sepa tipos estructurados en Delphi que no se inicializan/finalizados

+2

Los objetos TP se inicializan. Ellos son tratados de la misma manera que los registros. En realidad los usamos extensamente hasta que Delphi agregó soporte para registros con métodos. –

+0

registro u objeto no crea pérdidas de memoria si las instalas utilizando matrices dinámicas o en la pila, lo cual es muy común. Solo con la asignación de montón es necesario Nuevo() y Eliminar(). No es muy difícil usar New (aRecordPointer) que anObject.Create ... –

+0

http://groups.google.com/group/comp.lang.pascal.delphi.misc/msg/2176ea3300f2dfb9 Admitido, va para objetos TP que tiene un VMT. Entonces el uso como registro está bien, el uso como objeto no es –

10

Es una pérdida de memoria si se produce una excepción en entre tus pares asignar/desasignar. Es normal protegerlos como tales:

New(Data); 
Try 
    Data.Int := 42; 
    Data.Str := 'Test'; 
Finally 
    Dispose(Data); 
End; 
+1

+1 para intentar ... finalmente –

+0

Debería asignar mejor sus registros en la pila, ya sea en una matriz dinámica. Ambos inicializarán el contenido de cada elemento de registro. El try..finally es obligatorio para la asignación de heap, como TObject.Create necesita un try correspondiente ... por último Free. Tal intento ... finalmente será creado automáticamente por el compilador si su registro se asigna a través de una matriz dinámica o en la pila. –

+0

@ArnaudBouchez Asigne una matriz si desea una matriz. No es apropiado si quieres un solo registro. Asigne en el montón con 'Nuevo' en lugar de la pila si la duración del registro debe sobrevivir al alcance que crea el registro. –

Cuestiones relacionadas