我正试图在Delphi中运行一个旧的midi组件,它在很大程度上是有效的,但是如果我尝试加载两个文件,它就会崩溃。
一些研究使我安装了EurekaLog,它指出了code.yay中的内存泄漏!
我不太擅长内存指针之类的东西,但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;发布于 2010-01-19 02:28:03
您不能将类型转换为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;发布于 2010-01-19 02:34:33
科内尔的想法是对的。您可以进一步简化它,如下所示:
function TMidifile.ReadString(F: integer): AnsiString;
begin
SetLength(Result, F);
Move(ChunkIndex^, result[1], F);
inc(chuncIndex, F);
end;这将使阅读速度更快,特别是如果您使用的是Move的Fastcode版本(或者是内置到RTL中的Fastcode版本附带的最新版本的Delphi )。
发布于 2010-01-19 02:27:45
问题是,您不能将一堆随机字节转换为string。string有一个特定的结构,分配由编译器管理。
我可以为你重写这一部分,但我不认为我会给你任何帮助,因为我必须假设调用它的代码在内存管理方面并没有做得更好。
https://stackoverflow.com/questions/2088216
复制相似问题