GARANTIR DESCONTO

Fórum Ponteiros e Dispose() #281066

11/05/2005

0

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 :
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

Vinicius2k

Responder

Posts

11/05/2005

Massuda

... 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 form


Responder

Gostei + 0

11/05/2005

Nildo

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


Responder

Gostei + 0

11/05/2005

Vinicius2k

Massuda,
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.


Responder

Gostei + 0

11/05/2005

Massuda

...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.


Responder

Gostei + 0

11/05/2005

Vinicius2k

Blz ! Entendido !

Obrigado Massuda e nildo ! :wink:

T+


Responder

Gostei + 0

Utilizamos cookies para fornecer uma melhor experiência para nossos usuários, consulte nossa política de privacidade.

Aceitar