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