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