我正在尝试在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;
答案 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)
问题在于你无法获取一堆随机字节并将其转换为string
。 string
具有特定的结构,分配由编译器管理。
我可以为你重写这一点,但我认为我不会给你任何好处,因为我必须假设调用它的代码在内存管理方面没有做得更好。