Ponteiros e Dispose()
Colegas,
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 :
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.
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
Curtidas 0
Respostas
Massuda
11/05/2005
... existe a necessidade de, antes de fechar o form, percorrer o TList aplicando [b:d052c6834e]Dispose[/b:d052c6834e] nos ponteiros e, após isto, aplicar o [b:d052c6834e]Free[/b:d052c6834e] na TList...
Pelo que entendi, você tem em um form um TList com ponteiros para records alocados via New. Nesse caso, faça o que você descreveu no evento OnDestroy ou no destrutor Destroy do formGOSTEI 0
Nildo
11/05/2005
Você pode testar... Salva o ponteiro em uma outra variavel de um outro Form, Libere da memória o Form que tinha o ponteiro alocado, volta pro outro local onde você salvou o ponteiro, e veja se existe o conteúdo do mesmo
GOSTEI 0
Vinicius2k
11/05/2005
Massuda,
Exatamente. Desta forma:
Bem, na verdade estou fazendo isto no OnClose do form... está errado?
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.
Pelo que entendi, você tem em um form um TList com ponteiros para records alocados via New.
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;
Nesse caso, faça o que você descreveu no evento OnDestroy ou no destrutor Destroy do form
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
Massuda
11/05/2005
...na verdade estou fazendo isto no OnClose do form... está errado?
Se o form não é utilizado mais depois de fechado (como você citou), não tem problema. Eu costumo usar OnDestroy (ou Destroy) porque é aí que tradicionalmente as tarefas relacionadas com finalização de um objeto (como liberar memória/objetos alocados internamente) são executadas.... o fato de estar utilizando ponteiros para records, tira as variáveis, mesmo sendo privadas, do escopo do formulário?
Aqui a questão é gerenciamento de memória e não escopo/visibilidade.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
Vinicius2k
11/05/2005
Blz ! Entendido !
Obrigado Massuda e nildo ! :wink:
T+
Obrigado Massuda e nildo ! :wink:
T+
GOSTEI 0