2009/2/27 Marcos Douglas <m...@delfire.net>:
> 2009/2/26 Joao Morais <jcmorai...@gmail.com>
>> > Mas se eu propagar este objeto para uma outra rotina, o Delphi tb irá
>> > fazer a liberação de memória, como?
>>
>> Você pode propagar quanto quiser, contanto que não utilize o objeto
>> quando ele sair de contexto (ou seja, final do bloco except). Se
>> precisar dos dados, clone-o ou copie dele o que for relevante.
>
> Olá João, eu sabia que vc responderia!
> Então, "como" o compilador desaloca a memória é uma incógnita, certo?
> Apenas sabemos que ele faz (deve ter um E.Free antes do "end" do
> "except" ou qq coisa parecida).

Exato. É desalocado imediatamente antes do bloco except terminar.

> Bem, isso eu também sabia. Minha dúvida (não sei porque tive essa
> dúvida depois de tanto tempo) é justamente poder ou não propagar
> (passar como parâmetro) o objeto E (a variável de Exceção) para uma
> outra rotina. Se o compilador, digamos, "adiciona" um E.Free antes de
> sair do bloco try/except/end, então teria que dar erro se eu
> utilizasse o objeto fora deste contexto, mas isso não acontece.
> Tem alguma idéia sobre isso?

Você pode usar esse objeto fora do bloco except, você só não pode
copiar uma referência para o objeto e usar a referência *depois* de
passar pelo end, aonde um E.Free está implícito. Se você não tem AVs é
porque, ou você não usa o objeto depois do final do except, ou seu
gerenciador de memória está pouco agressivo e você poderá ter
problemas aleatórios mais cedo ou mais tarde. Tente usar FastMM em
modo debug. Recomendo você não fazer cópia da referência para o objeto
E, e se precisar guardar informações, fazer um clone dele ou copiar o
que tiver de relevante.

Joao Morais

Responder a