Ir para conteúdo
Fórum Script Brasil
  • 0

Heap


Thales Pontes Martins

Pergunta

E aí gente? Eu gostaria de saber se tem como saber quantos bytes de memória ram o meu programa está utilizando. É porque enquanto roda, meu programa faz uma série de criações e destruições de Classes e queria saber se está sobrando algum lixo pelo caminho. Depois pretendo utilizar o recurso para outros própositos também.

Obrigado.

Link para o comentário
Compartilhar em outros sites

10 respostass a esta questão

Posts Recomendados

  • 0

http://v.mahon.free.fr/pro/freeware/memcheck

uma unit que declarada na raiz do sua aplicacao (project/view source)

como primeira unit, checa por buracos que sua aplicacao deixa

na memoria (memory leaks), e gera um report com informações...

pra sair informações detalhadas você deve habilitar o TD32 debug

Info, em Project/Options, na aba Linker...

habilite

Include TD32 debug info

Include remote debug symbols

senão sai somente os endereços de mémoria e asm

isso no delphi 6 em outros delphi não sei se é igual pra habilitar

abraços

Link para o comentário
Compartilhar em outros sites

  • 0

pois é sc3, esse link fala sobre as variáveis AllocMemCount e AllocMemSize que como eu disse, no Delphi 2006 estão deprecated.

Com essa função (GetHeapStatus) eu consegui detectar e resolver algums leaks. Só que eu observei que ela também está deprecated no Delphi 2006 apesar de funcionar; Isso significa que deve haver outra função que a substitui, mas qual?

Outra dúvida que surgiu é o seguinte -> Eu tenho um form que minha aplicação cria ao ser clicado um botão, e libera da memória ao ser fechado. Nele eu tenho declarado uma var TForm na interface Private ->

type
  TForm2 = class(TForm)
.
.
.
Private
  _form : TForm;
.
.
.
Essa variável _form vai receber no caso o form principal, porque o form que eu estou criando controla algumas propriedades do form principal. Aí tem um botão no form que o fecha ->
procedure TForm2.button1Click(sender : tobject);
begin
  hide;
  free;
  if assigned(_form.OnPaint) then _form.OnPaint(_form);
end;

Pergunta: Se eu leio a variável _form depois que eu chamo um free no Form2 não era pra dar erro? Já que _form é um campo de Form2 e que já não existe mais porque eu chamei free?

Ou será que a memória não está mais alocada mais seu conteúdo ainda permanece?

Link para o comentário
Compartilhar em outros sites

  • 0

Normalmente deprecated significa que a função foi substituída por outra melhor ou mais completa, mas não significa que você não possa utilizá-la, simplesmente ela é mantida para efeito de compatibilidade.

Quanto à variável _TForm, pela sua declaração ela é simplesmente um ponteiro(4bytes) dentro de Form2 que aponta para um objeto.

Se _TForm foi criado com Owner de Form2, então quando você der Form2.Free, _TForm é destruído também.

Se o Owner de _TForm for outro (TApplication) por exemplo, então ele será destruído quando seu Owner for destruído.

Agora se você tem acesso à _TForm após você dar Form2.Free, é simplesmente sorte da memória ainda estar com aquela informação, porque ela está assinalada como liberada e a qualquer momento poderá ocorrer um access violation.

Link para o comentário
Compartilhar em outros sites

  • 0

As variáveis AllocMemCount e AllocMemSize no Delphi 2006 sempre contém 0. Estão unsuported.

Mas então é errado escrever alguma coisa depois de free ou até mesmo chamar free dentro do código do próprio objeto que se destrói? Porque se for um método dinamico quer dizer que o endereço do próprio código que está em execução já foi desalocado?!

O mais correto então seria colocar Action:=caFree; no evento OnClose do form?

Link para o comentário
Compartilhar em outros sites

  • 0
As variáveis AllocMemCount e AllocMemSize no Delphi 2006 sempre contém 0. Estão unsuported.
O Delphi 2006 não conheço, mas pelo que ví elas retornam 0 mesmo. Utilize as funções da FastMM.pas, ela é free, dê uma pesquisada pelo Google.

Mas então é errado escrever alguma coisa depois de free ou até mesmo chamar free dentro do código do próprio objeto que se destrói? Porque se for um método dinamico quer dizer que o endereço do próprio código que está em execução já foi desalocado?!

O mais correto então seria colocar Action:=caFree; no evento OnClose do form?

Não acho boa prática de programação você liberar um objeto em seu próprio código. Normalmente se libera um objeto a partir de outro; se for um componente e possuir um Owner, então seu Owner se encarregará disso.

O Action := caFree; é o meio mais comum de se liberar um Form da memória; pois após ele terminar toda a execução do evento onClose, será executado Form.Free e se tiver código escrito no evento onDestroy, ele será executado para depois então o Form ser definitavemente liberado.

Link para o comentário
Compartilhar em outros sites

Participe da discussão

Você pode postar agora e se registrar depois. Se você já tem uma conta, acesse agora para postar com sua conta.

Visitante
Responder esta pergunta...

×   Você colou conteúdo com formatação.   Remover formatação

  Apenas 75 emoticons são permitidos.

×   Seu link foi incorporado automaticamente.   Exibir como um link em vez disso

×   Seu conteúdo anterior foi restaurado.   Limpar Editor

×   Você não pode colar imagens diretamente. Carregar ou inserir imagens do URL.



  • Estatísticas dos Fóruns

    • Tópicos
      152,1k
    • Posts
      651,8k
×
×
  • Criar Novo...