Leodinei Bielak wrote:
> 2008/1/21 Joao Morais <[EMAIL PROTECTED]>:
>>  Você pode detalhar melhor, colocar algum código exemplo, colocar o que
>>  te fez perceber que o destrutor não é chamado, etc?
> 
> Eu tenho algo assim:
>   TObject -> TPessoa;
>   TObject -> TEndereco;
> 
>   TCliente = class(TPessoa)
>     Endereco : TEndereco;
>   end;
> 
> Todas as classes criadas por mim tem um destructor e um constructor
> criado e chamam inherited dentro deles.
> O que acontece é que quando eu uso Classe.Free e FreeAndNill(Classe) o
> destructor não é chamado nunca e a memória não é liberada.
> Só funciona se eu chamar o Destroy diretamente.

Ainda tá complicado entender o que está acontecendo, mas vamos tentar 
algumas dicas:

- Você precisa colocar "override;" atras da declaração destructor Destroy;
- mesmo que você não declare um destrutor, ou mesmo que você declare sem 
override (o que é um erro), ou ainda que você declare e não chame o 
inherited, o seu objeto será destruido assim mesmo;
- A chamada ao Free fará com que o Destroy, que é virtual, seja chamado. 
Quando você usa o override, você informa ao compilador que o seu Destroy 
deve ser executado, e não aquele declarado em TObject. Quando você não 
usa o override, o TObject.Destroy é que é chamado, e isto faz com que 
seu objeto seja destruido, no entanto seu TCliente.Destroy não é chamado;
- Use fastmm e tenha certeza de que você tem mesmo um vazamento, e 
verifique quais são as classes que estão vazando;
- O FreeAndNil é usado com a instância, não com a classe. Ou seja, é 
FreeAndNil(VarQueApontaPraCliente) e não FreeAndNil(TCliente);

Por gentileza, manda mais detalhe do que você está fazendo.

> Eu não sobrescrevi o método Free.

Nem tem como, ele é estático.

--
Joao Morais

Responder a