Liberar da memória todas as estancias criadas de uma classe

Delphi

29/06/2009

Pessoal...
Tem como eu liberar da memória todas as estancias criadas de uma determinada classe?
Vamos dizer que essa classe esta criando outras estancias dela mesma...
Em um determinado momento, todo e qualquer objeto que foi criado dessa classe, gostaria de liberar da memória....
tem como?
Abraços.


[vaza]

[vaza]

Curtidas 0

Respostas

Rodc

Rodc

29/06/2009

Se você tem o ponteiro para estas classes tem como sim... mas se você está fazendo esta pergunta é porque possivelmente você não tem os ponteiros para estas classes, correto?
Sugiro você usar um TList que guarde os ponteiros para estas classes, e depois percorra o TList destruindo todas as classes referenciadas nela.


GOSTEI 0
Edsant

Edsant

29/06/2009

Amigo, eu geralmente utilizo [b:ae71124014]interfaces[/b:ae71124014]. ai não preciso me preocupar com destruição de classes....

Até mais...


GOSTEI 0
[vaza]

[vaza]

29/06/2009

Se você tem o ponteiro para estas classes tem como sim... mas se você está fazendo esta pergunta é porque possivelmente você não tem os ponteiros para estas classes, correto? Sugiro você usar um TList que guarde os ponteiros para estas classes, e depois percorra o TList destruindo todas as classes referenciadas nela.


Amigo, poderia me dar um simples exemplo por favor?


GOSTEI 0
Rodc

Rodc

29/06/2009

Faz um tempo que não programo mais em Delphi, só em C++Builder, mas vou tentar fazer um exemplo simples, dentro do evento de um botão, por exemplo.
var
    lista: TList;
    botao: TButton;
    x: integer;
begin
lista := TList.Create();

    // cria primeiro botão
    botao = TButton.Create(self);
    // adiciona primeiro na lista
    lista.Add(botao);
    //cria segundo botão
    botao = TButton.Create(self);
    // adiciona segundo na lista
    lista.Add(botao);
    //cria terceiro botão
    botao = TButton.Create(self);
    // adiciona terceiro na lista
    lista.Add(botao);

    /* neste momento a lista contém o ponteiro de três
       classes do tipo TButton instanciadas em memória */

    // Percorre a lista de botões destruindo as classes
    for x:=lista.Count downto 0 do
    begin
    TButton(lista[x]).Free;
        lista.Delete(x);
    end;
end;

Não sei nem se vai compilar este código, pois não testei... Mas a idéia é demostrar que você criou três objetos em memória e depois destrui eles, apenas com a referência para a memória deles.


GOSTEI 0
[vaza]

[vaza]

29/06/2009

Vlw cara...entendi :)
obrigadão.
Tentarei aqui.


GOSTEI 0
[vaza]

[vaza]

29/06/2009

Tem como eu pegar o número de instancias de uma classe sem ser por TList como no exemplo?


GOSTEI 0
Rodc

Rodc

29/06/2009

Até onde eu saiba não tem como, pois se você cria um objeto em memória e depois não guarda o endereço onde o objeto está alocado em memória, como é que você vai acessar ele? Vai varrer toda a memória até encontrar uma estrutura válida?
A não ser que o RTTI do Delphi guarde alguma informação sobre os objetos criados...


GOSTEI 0
Osocram

Osocram

29/06/2009

Amigo acho q a solução do rodc é a melhor.
usando TList, é o que eu faria tbm.
Apesar que depende o vc realmente precisa podemos dar outras soluções.

[quote:1446a06dc6=´[VAZA]´]Tem como eu pegar o número de instancias de uma classe sem ser por TList como no exemplo?[/quote:1446a06dc6]


GOSTEI 0
POSTAR