Mi sono chiesto perché la maggior parte degli esempi Delphi utilizza FillChar() per inizializzare i record.Perché la maggior parte degli esempi Delphi utilizzano FillChar() per inizializzare i record?
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.
Qui (http://stanleyxu2005.blogspot.com/2008/01/potential-memory-leak-by-initializing.html) è la mia nota su questo argomento. IMO, dichiara una costante con valore predefinito è un modo migliore.
>>> L'uso di FillChar sulla variabile record dopo che un valore è stato assegnato al campo stringa, non è consigliato In questi casi è necessario utilizzare Finalize (V); FillChar (V, SizeOf (V), 0); Se lo fai frequentemente, puoi scrivere una nuova funzione, che è Finalize + FillChar. Penso che l'utilizzo di FillChar sarà più veloce e quindi l'assegnazione a una costante, ma probabilmente non è rilevante oggi. Ancora più importante: non è necessario dichiarare una costante per ogni tipo di record. – Alex
>> Penso che l'uso di FillChar sarà più veloce dell'assegnazione a una costante, ma probabilmente non è rilevante oggi. Ancora più importante: non è necessario dichiarare una costante per ogni tipo di record. << Questo è il motivo per cui considero un abuso. Sarebbe fantastico, se il compilatore supporta la parola di riserva "void", in modo che possiamo semplicemente scrivere "Foo: = void;" per inizializzare un record. – stanleyxu2005
lo uso ogni volta che posso poiché mi aiuta a seguire il principio Aperto/Chiuso. quindi quando un record ha un nuovo membro (non stringa) aggiunto, non è necessaria un'ulteriore inizializzazione. –