Davi Eduardo Borges Wall wrote: > Eu ainda diria para você tomar de costume sempre que possível > inicializar variáveis. É uma boa prática de programação e > evita problemas futuros.
Toda variável deve ser inicializada, sempre. Se ela for definida no corpo da unit (fora de um método, função ou procedimento), ela atualmente é pré-inicializada mas isso pode mudar em versões futuras do compilador. Se ela for definida dentro de uma rotina, ela é alocada no stack e virá com a tralha que já havia naquela região da memória. No caso de campos de um record, eles são parte da própria variável e certamente seguem as mesmas regras. No caso de membros de uma classe, o construtor da classe (mais precisamente o método TObject.NewInstance) faz a limpeza implicitamente. Quando você: TNovaClasse = class(TObject) private FValue: Integer; FUmPonteiro: Pointer; end; ao criar uma instância de TNovaClasse você pode se assegurar de que FValue sempre será zero e que FUmPonteiro sempre será nil. Sempre. Em qualquer versão do compilador (Delphi ou FPC) atual ou futura. Por sinal eu costumo usar muita carga sob demanda, e uso esse truque aqui: TCarga = class(TObject) private FEncaps: TEncaps; function GetEncaps: TEncaps; public destructor Destroy; override; property Encaps: TEncaps read GetEncaps; end; ... function TCarga.GetEncaps: TEncaps; begin if not Assigned(FEncaps) then FEncaps := TEncaps.Create; Result := FEncaps; end; destructor TCarga.Destroy; begin FEncaps.Free; inherited; end; Note que não existe create, que eu testo FEncaps sem inicializá-lo, que eu chamo FEncaps.Free sem saber se ele foi ou não foi criado, e isto é 100% seguro. Mas isto é apenas dentro de uma classe. Maravilhas da OOP. Meus $ 0,02 Joao Morais