Francesco Perrotti wrote: > Agradeço ao Rubens e ao João Morais as explicações, realmente foram > esclarecedoras. > As vezes fico em dúvida sobre o que o Delphi faz automaticamente e o que não > faz. > No caso de C é mais simples, ele nunca faz nada, a gente tem que fazer tudo, > aí não tem dúvida, só mais trabalho :-).
Se o tipo for string (ansi string), o Delphi faz tudo. Se não for, o Delphi faz nada. > Fiz um programa de teste e aparentemente funcionou. Usei a seguinte função, > que não é > exatamente o que vou usar na DLL, mas serve como teste: > > function GetStrTime: pchar;var St: string;begin St := 'Hora: ' + > TimeToStr(Now); GetMem(Result, Length(St)+1); StrCopy(Result, > PChar(St));end; > E pra testar, coloquei um memo no form e o seguinte código em um botão: > > procedure TForm1.Button1Click(Sender: TObject);var i: integer; p: > PChar;begin for i := 1 to 1000 do begin p := GetStrTime; > Memo1.Lines.Add(String(P)); FreeMem(p); end;end; > > Funcionou a contento, sem dar nenhuma exceção, então acho que o problema tá > resolvido. Instala o FastMM no seu projeto e liga FullDebugMode. Ele é bem melhor que o gerenciador de memória do Delphi (até o 2005) pra pegar corrupção de memória, sem falar que vai te avisar de vazamentos. Joao Morais