Fórum Ponteiros e Dispose() #281066
11/05/2005
0
Estou com uma dúvida que não consegui definição precisa em documentação. Penso que não haja necessidade, mas gostaria de confirmar.
Dentro desta estrutura :
type PFieldDef = ^AFieldDef; AFieldDef = record FType, FName, FMask: String; FSize: Integer; end; TfrmFormulario = class(TForm) ... private AField: PFieldDef; FieldsList: TList; ... public ... end;
Como as variáveis [b:3d5e42b470]AField[/b:3d5e42b470] e [b:3d5e42b470]FieldsList[/b:3d5e42b470] são privadas do form, existe a necessidade de, antes de fechar o form, percorrer o TList aplicando [b:3d5e42b470]Dispose[/b:3d5e42b470] nos ponteiros e, após isto, aplicar o [b:3d5e42b470]Free[/b:3d5e42b470] na TList, ou o [b:3d5e42b470]Free do próprio formulário[/b:3d5e42b470] irá liberar tudo ?
Desde já agradeço.
Vinicius2k
Curtir tópico
+ 0Posts
11/05/2005
Massuda
Gostei + 0
11/05/2005
Nildo
Gostei + 0
11/05/2005
Vinicius2k
Exatamente. Desta forma:
procedure ... var I, J: Integer; begin FieldsList := TList.Create; ... for I := 0 to J do begin New(AField); with AField^ do begin FType := ´´; FName := ´´; FMask := ´´; FSize := 0; end; FieldsList.Add(AField); end; ... end;
Bem, na verdade estou fazendo isto no OnClose do form... está errado?
procedure ... ; var I: Integer; begin for I := 0 to (FieldsList.Count - 1) do begin AField := FieldsList[I]; ... Dispose(AField); end; ... FieldsList.Free; end;
Este form, depois de utilizado, é sempre liberado com Free... pensei que não haveria necessidade de trabalhar no OnDestroy. Normalmente, qualquer variável que eu utilizo no form eu a aloco como privada ou pública do próprio form para que ela seja liberada junto com o form. Isto está certo?
Agora eu fiquei meio confuso... o fato de estar utilizando ponteiros para records, tira as variáveis, mesmo sendo privadas, do escopo do formulário?
Obrigado.
Gostei + 0
11/05/2005
Massuda
Assumindo que você está programando para plataforma Win32, tem dois casos a considerar:[list:4d1c7281a7][*:4d1c7281a7][b:4d1c7281a7]objetos de classes derivadas de TComponent[/b:4d1c7281a7]: se você criou esses objetos com Owner <> nil, então é responsabilidade do Owner destruir esses objetos e, consequentemente, liberar a memória associada a eles.[*:4d1c7281a7][b:4d1c7281a7]objetos em geral e estruturas alocadas dinamicamente[/b:4d1c7281a7] (via New, GetMem, etc): se foi você que criou/alocou o objeto, você deve se encarregar de destruir/liberar o objeto.[/list:u:4d1c7281a7]No primeiro caso, não há problema se você destruir o objeto antes do Owner fazer isso.
Note que no caso da plataforma .Net, existe um mecanismo de coleta de lixo (similar ao usado em Java?) que irá destruir os objetos/liberar a memória quando eles não forem mais necessários.
Gostei + 0
11/05/2005
Vinicius2k
Obrigado Massuda e nildo ! :wink:
T+
Gostei + 0
Clique aqui para fazer login e interagir na Comunidade :)