Dúvidas em liberar objetos da memória
10/08/2006
0
Assim como crio os objetos em run time, também devo liberar ele quando não precisar mais, ex:
SqlBuscaCad := TClientDataSet.Create(Self);
Linha de código
Linha de código
.
.
SqlBuscaCad.Free;
No exemplo citado está certo esta forma ??? Se eu não libero, cria uma espécie de lixo ??? É isso ???
Aguardo um retorno
Rogério
Rogeranalista
Posts
10/08/2006
Michael
Aplicações Win32 não são gerenciadas. Desta forma, é responsabilidade do desenvolvedor liberar os objetos que cria. No .NET ou Java, por exemplo, isso não é necessário, pois existe um processo chamado [b:4d0d9a87e6]Garbage Collector[/b:4d0d9a87e6] - Coletor de lixo - que desaloca a memória de objetos que não são mais usados.
É importante frisar tbm que teoricamente o sistema operacional libera a memória alocada de um aplicativo quando ele termina. Porém, é mais elegante e otimizado não deixar para ele essa responsabilidade. Note também que isso só ocorre qdo o programa termina. Durante a sua execução é vc quem deve gerenciar o uso da memória do software.
Em Delphi, quando se cria componentes, é possível usar o [b:4d0d9a87e6]mecanismo de owner[/b:4d0d9a87e6], para delegar para outro componente a responsabilidade de liberar os objetos marcados como sendo seus. Isso é feito no construtor das classes (herdadas de [b:4d0d9a87e6]TComponent[/b:4d0d9a87e6]). No exemplo que vc colocou, o [b:4d0d9a87e6]Owner [/b:4d0d9a87e6]informado é [b:4d0d9a87e6]Self[/b:4d0d9a87e6], ou seja, o componente dentro do contexto da chamada. Quando ele for destruído, o [b:4d0d9a87e6]ClientDataSet [/b:4d0d9a87e6]tbm será.
Então, não é estranho que vc, algumas linhas abaixo, destrua o objeto? A regra é: se é o tempo de vida do componente é determinado, então use [b:4d0d9a87e6]nil[/b:4d0d9a87e6] como owner. Se não, use [b:4d0d9a87e6]Self[/b:4d0d9a87e6], para componentes, e [b:4d0d9a87e6]Application[/b:4d0d9a87e6], para forms.
Se restar alguma dúvida, sugiro a leitura do meu artigo sobre criação de componentes em run-time, que foi publicado na edição 72 da revista ClubeDelphi.
[]´s
11/08/2006
Dmalta
Quando você for criar um objeto em código que não tenha [i:ae69d33cd6]Owner[/i:ae69d33cd6], como no caso que o Michael explicou, é muito importante usar um bloco de proteção [i:ae69d33cd6]try..finally[/i:ae69d33cd6].
Por exemplo:
List := TStringList.Create; try { faz alguma coisa } finally List.Free; end;
Assim, se der algum problema entre o [i:ae69d33cd6]Create [/i:ae69d33cd6]e o [i:ae69d33cd6]Free[/i:ae69d33cd6] que gere uma exceção você garante que o objeto será liberado, não deixando vasamentos (´leaks´) de memória.
Um abraço
11/08/2006
Rogeranalista
O que seria mesmo Owner ??? Pode dar um exemplo ???
Aguardo um retorno
Rogério
12/08/2006
Raserafim
ex:
... var DataSet: TClientDataSet; begin DataSet := TClientDataSet.Create(Self); end;
neste exemplo o owner do DataSet (que é um componente ClientDataSet que está sendo criado em tempo de execução) é o Self (Self é o form ao qual vc está inserindo o componente ClientDataSet)
ou outro exemplo:
Form2 := TForm2.Create(Form1);
com este código vc está criando (instanciando) o form2 e dizendo que o Owner dele será o Form1. e com isso ao destruir o form1, automaticamente será destrído o form2.
o delphi faz o seguinte quando cria automaticamente os forms, ele coloca como o Owner o Application, e com isso ao fechar a aplicação todos os forms também serão destrídos.
14/08/2006
Michael
É mais correto dizer que [b:51430a3dc0]Owner [/b:51430a3dc0]é o proprietário de componentes, e não de objetos. O conceito de pai tbm existe, e é obtido através da propriedade [b:51430a3dc0]Parent[/b:51430a3dc0], introduzida e contemplada nas classes [b:51430a3dc0]TControl [/b:51430a3dc0]e [b:51430a3dc0]TWinControl[/b:51430a3dc0].
[]´s
14/08/2006
Siam
14/08/2006
Marco Salles
Não entendi...Com assim não possui... e o conceito de herança ???
ja que TWincontrol é descendente de TControl...
Compila normalmente....
14/08/2006
Michael
Perfeito [b:71afc13e55]Marcos Salles[/b:71afc13e55].
Componentes derivados de [b:71afc13e55]TControl [/b:71afc13e55]apenas podem ser filhos de outros. Para serem pais, devem descender de [b:71afc13e55]TWinControl[/b:71afc13e55]. Essa é a diferença do uso de [b:71afc13e55]Parent[/b:71afc13e55].
[]´s
14/08/2006
Rogeranalista
Ainda não testei se deu certo... Assim que eu fizer e testar avisarei no forum.
Rogério
Clique aqui para fazer login e interagir na Comunidade :)