Me pregunto por qué la mayoría de los ejemplos de Delphi usan FillChar() para inicializar registros.¿Por qué la mayoría de los ejemplos de Delphi utilizan FillChar() para inicializar registros?
type
TFoo = record
i: Integer;
s: string; // not safe in record, better use PChar instead
end;
const
EmptyFoo: TFoo = (i: 0; s: '');
procedure Test;
var
Foo: TFoo;
s2: string;
begin
Foo := EmptyFoo; // initialize a record
// Danger code starts
FillChar(Foo, SizeOf(Foo), #0);
s2 := Copy("Leak Test", 1, MaxInt); // The refcount of the string buffer = 1
Foo.s = s2; // The refcount of s2 = 2
FillChar(Foo, SizeOf(Foo), #0); // The refcount is expected to be 1, but it is still 2
end;
// After exiting the procedure, the string buffer still has 1 reference. This string buffer is regarded as a memory leak.
Aquí (http://stanleyxu2005.blogspot.com/2008/01/potential-memory-leak-by-initializing.html) es mi nota sobre este tema. OMI, declarar una constante con valor predeterminado es una mejor manera.
>>> No se recomienda el uso de FillChar en la variable de registro después de asignar un valor al campo de cadena En tales casos, debe utilizar Finalize (V); FillChar (V, SizeOf (V), 0); Si haces esto con frecuencia, puedes escribir una nueva función, que finaliza + FillChar. Creo que usar FillChar será más rápido que asignar a una constante, pero probablemente hoy no sea relevante. Más importante aún: no necesita declarar una constante para cada tipo de registro. – Alex
>> Creo que usar FillChar será más rápido que asignar a una constante, pero probablemente hoy no sea relevante. Más importante aún: no necesita declarar una constante para cada tipo de registro. << Es por eso que considero esto como un abuso. Sería genial, si el compilador admite la palabra de reserva "nulo", para que podamos escribir "Foo: = void"; para inicializar un registro. – stanleyxu2005
lo uso siempre que puedo ya que me ayuda a seguir el principio de abierto/cerrado. luego, cuando un registro tiene agregado un miembro nuevo (sin cadena), no es necesaria una inicialización adicional. –