Fórum Destruir instancia da memoria #325784
21/07/2006
0
Function RerImagem: Tbitmap; Var Tb: TBitmap; begin Tb:= TBitmap.Create; try Tb.Width := 700; Tb.Height:= 500; ct.BufferedDisplay:=False; ct.Draw(Tb.Canvas,Rect(0, 0, 700, 500)); ct.BufferedDisplay:=True; Result:= Tb; finally // FreeAndNil(Tb); se habilitar aqui não retorna a imagem end; end;
helllppppp.....
Sremulador
Curtir tópico
+ 0Posts
21/07/2006
Massuda
var Bitmap: TBitmap; ... Bitmap := RerImagem; // faz alguma coisa com Bitmap Bitmap.Free; ...
Gostei + 0
21/07/2006
Marco Salles
[b:0f2429c6ed]´Neste caso, sremulador , voce esta criando uma função que retornará uma nova instância de TBitmap . Portanto não é correto destruir o objeto referenciado por Tb no final da função, porque assim destruirá o próprio objeto que deveria ser retornado, devolvendo um ponteiro inválido que pode causar uma AccessViolation na primeira referência ao objeto na memória. entre outros erros´[/b:0f2429c6ed]
Gostei + 0
21/07/2006
Massuda
Gostei + 0
22/07/2006
Sremulador
Concordo plenamente, mas como resolver esta broncad...
Gostei + 0
22/07/2006
Bruno Belchior
Gostei + 0
22/07/2006
Marco Salles
... [/quote:41443584b8]
em outras palavras:
citação de Bruno Belchior
Gostei + 0
22/07/2006
Sremulador
Gostei + 0
05/08/2006
Raserafim
Gostei + 0
06/08/2006
Michael
procedure RerImagem(var Imagem: TBitmap); begin Imagem.Width := 700; Imagem.Height:= 500; ct.BufferedDisplay:=False; ct.Draw(Imagem.Canvas,Rect(0, 0, 700, 500)); ct.BufferedDisplay:=True; end;
E, no local da chamada a esta procedure:
var Imagem: TBitmap; begin Imagem := TBitmap.Create; try RetImagem(Imagem); // Faz alguma coisa com Imagem finally Imagem.Free; end; end;
Via de regra quem cria um objeto deve destruí-lo - excetuando-se componentes, que podem ter um [b:814d170aca]Owner [/b:814d170aca]para fazer isso. Se uma função retorna uma instância de uma classe, então esta responsabilidade está sendo repassada para o seu chamador, e isso muitas vezes não fica claro, o que pode levar a memory leaks na aplicação.
Negativo. No Delphi a única forma de se ´automatizar´ a desalocação de memória de objetos é utilizando-se o mecanismo de Owner, que funciona apenas com componentes. Ou através de [b:814d170aca]interfaces[/b:814d170aca], que possuem [b:814d170aca]Reference Count[/b:814d170aca]. No mais é o programador quem deve se preocupar em liberar a memória utilizada.
Em ambientes gerenciados, como o .NET e Java, a desalocação de memória é feita pela própria plataforma, através do [b:814d170aca]Garbage Collecto[/b:814d170aca]r. Desta forma não é necessário explicitamente destruir objetos, pois isso será feito automaticamente assim que eles perderem referência (RefCount = 0).
Para quem ainda tem alguma dúvida sobre criação e destruição de objetos e componentes em run-time, eu sugiro a leituro do meu artigo sobre o assunto, publicado na edição 72 da revista ClubeDelphi.
[]´s
Gostei + 0
07/08/2006
Siam
Gostei + 0
07/08/2006
Marco Salles
[b:a162055b0c]Falou Tudo...[/b:a162055b0c]
Gostei + 0
07/08/2006
Siam
Gostei + 0
07/08/2006
Marco Salles
:arrow:
Olha o parametro [b:b2c47def40]Var[/b:b2c47def40] no esboço da procedure
[b:b2c47def40]procedure RerImagem(var Imagem: TBitmap); [/b:b2c47def40]
ao inves disso:
[b:b2c47def40]Function RerImagem: Tbitmap; [/b:b2c47def40]
Gostei + 0
07/08/2006
Siam
Gostaria que fosse fundamentada essa teoria pq até então acho que vai da maneira de cada um programar.
Gostei + 0
07/08/2006
Marco Salles
Se voce usa funçoes e destroi o objeto referenciado no final da função no meu entendimento isto não esta correto...
Se o sremulador , não executasse seguidas veses o mesmo codigo , não iria perceber nenhuma anormalidade , passando por despercebido , algo conceitualmente errado.
Foi dado aqui duas saídas para o problema.. Uma usando função
1)
quando se usa [b:d453a7f944]funçoes[/b:d453a7f944] , voce deve tomar o cuidado de não destruir o objeto no Final da função... Então quem deve destruir o Objeto é o Chamador. Porem , isto pode não ficar claro , com anota o micheus em seu paragrafo sobre o assunto
2)
Agora usando [b:d453a7f944]procedures[/b:d453a7f944] o codigo fica mais limpo pois quem cria um objeto deve destruí-lo....E na chamada voce deve passar usando o parametro [b:d453a7f944]Var[/b:d453a7f944]
Gostei + 0
Clique aqui para fazer login e interagir na Comunidade :)