ReportMemoryLeaksOnShutdown: Memory Leak em Delphi

Delphi

28/09/2009

Estou usando Delphi 2007 e o meu Dpr esta assim:

program Project1;

uses
  Forms,
   SysUtils,
  Unit1 in ´Unit1.pas´ ;

{$R *.res}

begin
  ReportMemoryLeaksOnShutdown := True;
  Application.Initialize;
  Application.MainFormOnTaskbar := True;
  Application.CreateForm(TForm1, Form1);
  Application.Run;
  datetostr(date);
end.


Da Memory Leak ??????? ReportMemoryLeaksOnShutdown

PQ ???

obs: Não tem nada no Form ... O Projeto esta Vazio , digamos assim
Marco Salles

Marco Salles

Curtidas 0

Respostas

Afarias

Afarias

28/09/2009

Qual a mensagem (relatório) do memory leak?


T+


GOSTEI 0
Marco Salles

Marco Salles

28/09/2009

13-20 Bytes:String x1



GOSTEI 0
Joaoshi

Joaoshi

28/09/2009

Esta linha é o problema:

datetostr(date); 



GOSTEI 0
Osocram

Osocram

28/09/2009

Marco Salles.
Da a impressão que essa linha
datetostr(date); 

acabou alocando o resultado em memoria em algum lugar, mais provavel que foi no ´limbo´.
E como antes de fechar o projeto tinha algo em memoria ele deu memory leak


GOSTEI 0
Marco Salles

Marco Salles

28/09/2009

Tá , mas mesmo trocando de lugar , continua a mesma mesnagem

uses 
  Forms, 
   SysUtils, 
  Unit1 in ´Unit1.pas´ ; 

{$R *.res} 

begin 
  ReportMemoryLeaksOnShutdown := True; 
  datetostr(date);  /////////////Colocando aqui oooo
  Application.Initialize; 
  Application.MainFormOnTaskbar := True; 
  Application.CreateForm(TForm1, Form1); 
  Application.Run;  
end.



GOSTEI 0
Afarias

Afarias

28/09/2009

|datetostr(date);

o q exatamente esta linha de comando faz?? não parece fazer sentido algum



T+


GOSTEI 0
Marco Salles

Marco Salles

28/09/2009

datetostr(date); o q exatamente esta linha de comando faz?? não parece fazer sentido algum


Nenhum sentido ...

para quem quiser simular o erro , fica mais fácil

claro que meu dpr original é bem mais complexo . Mas fui depurando e no
gargalho cheguei a esta Instrução ... Então para facilitar a comunicação so
coloquei a instrução que esta dando Memory Leak para que outros atestem
e deem a opinião , simulando a experiencia em suas resptivas máquinas


GOSTEI 0
Afarias

Afarias

28/09/2009

Se vc atribuir o valor da função a uma variável STRING (AnsiString) ainda assim recebe a mensagem de memory leak ?

VariavelString := DateToStr(Date);


??


T+


GOSTEI 0
Marco Salles

Marco Salles

28/09/2009

com AnsiString e com String Somente . com Showmessage e sem
Showmessage .

program Project1;

uses
  Forms,
   SysUtils,
   dialogs,
   Unit1 in ´Unit1.pas´ ;

{$R *.res}

var
mens:String;

begin
 ReportMemoryLeaksOnShutdown := True;
 mens:=Datetostr(date);
 Showmessage(mens);
  Application.Initialize;
  Application.MainFormOnTaskbar := True;
  Application.CreateForm(TForm1, Form1);
  Application.Run;
end.


Algume ja simulou este codigo no Delphi2007 ???


GOSTEI 0
Afarias

Afarias

28/09/2009

Pelo fato de ´long strings´ terem a memória dinamicamente alocada e de-alocada no Delphi (via sistema de reference-counting) somado a forma como o Delphi trata as variáveis globais (digamos q... ´soma 1 ao número de referências´) este ´estranho memory leak´ pode ser reportado.

Isto teoricamente ocorre apenas para strings como variáveis globais atribuídas por funções (que retornam string). Exatamente o seu caso.

Entretanto isto não é um memory leak real. Com o encerramento do processo a memória será devolvida ao SO como parte do sistema de ´finalização´ do Delphi voltado para variáveis globais -- apenas que o gerenciador de memória (FastMM) não toma conhecimento, e assim reporta como memory leak


T+


GOSTEI 0
Afarias

Afarias

28/09/2009

+1 coisa... não sei se pq a partir do D2006 quando o FastMM foi incluído no Delphi deixou de ser necessário mas a unidade do FastMM fosse incluida explicitamente na uses do DPR.

Ela deve ser sempre a primeira da uses no DPR ou diversos memory leaks falsos são reportados.

Imagino q no D2007 a IDE/compilador inclua automaticamente mas, se não tiver certeza, coloque explicitamente.

Tb verifique se o seu Delphi/FastMM está atualizado.



T+


GOSTEI 0
Vinicius Silva

Vinicius Silva

28/09/2009

Estou usando Delphi 2007 e o meu Dpr esta assim:

program Project1;

uses
  Forms,
   SysUtils,
  Unit1 in ´Unit1.pas´ ;

{$R *.res}

begin
  ReportMemoryLeaksOnShutdown := True;
  Application.Initialize;
  Application.MainFormOnTaskbar := True;
  Application.CreateForm(TForm1, Form1);
  Application.Run;
  datetostr(date);
end.


Da Memory Leak ??????? ReportMemoryLeaksOnShutdown

PQ ???

obs: Não tem nada no Form ... O Projeto esta Vazio , digamos assim


Como fazer gravar o log com os memory leaks encontrados? Por que ativando o ReportMemory ele so exibe um dialog quando fecha a aplicação.
GOSTEI 0
POSTAR