getmem内存泄漏,delphi

时间:2010-01-18 18:22:49

标签: delphi memory-leaks

我正在尝试在Delphi中运行一个旧的midi组件,它适用于大部分内容,但是如果我尝试连续加载2个文件,它就会崩溃。

一些研究让我安装了EurekaLog,它指向代码中的内存泄漏。

我对内存指针的东西不是很好,但这个代码向下突出显示Eureka在这里让我思考,也许有一个内存没有被释放的错误?

我尝试在其末尾添加FreeMem,但它不起作用?

function TMidifile.ReadString(F: integer): string;
var
  s: PChar;
  i: integer;
begin
  GetMem(s, F + 1);
  s[F] := chr(0);
  for i := 0 to F - 1 do
  begin
    s[i] := Chr(chunkIndex^);
    inc(chunkIndex);
  end;
  result := string(s);
end;

3 个答案:

答案 0 :(得分:3)

Kornel有正确的想法。您可以进一步简化它,如下所示:

function TMidifile.ReadString(F: integer): AnsiString; 
begin
  SetLength(Result, F);
  Move(ChunkIndex^, result[1], F);
  inc(chuncIndex, F);
end;

这将使阅读速度更快,特别是如果您使用的是Fastcode版本的Move(或者RTL中内置的Fastcode版本附带的最新版Delphi。)

答案 1 :(得分:2)

您无法对AnsiString进行类型转换,因为它们是引用计数的。

这不会更容易吗?

function TMidifile.ReadString(F: integer): string; 
var i: integer; 
begin
  SetLength(Result, F);  
  for i := 1 to F do 
  begin 
    Result[i] := Chr(chunkIndex^); 
    inc(chunkIndex); 
  end; 
end;

答案 2 :(得分:0)

问题在于你无法获取一堆随机字节并将其转换为stringstring具有特定的结构,分配由编译器管理。

我可以为你重写这一点,但我认为我不会给你任何好处,因为我必须假设调用它的代码在内存管理方面没有做得更好。