首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >getmem内存泄漏,delphi

getmem内存泄漏,delphi
EN

Stack Overflow用户
提问于 2010-01-19 02:22:49
回答 3查看 1.3K关注 0票数 2

我正试图在Delphi中运行一个旧的midi组件,它在很大程度上是有效的,但是如果我尝试加载两个文件,它就会崩溃。

一些研究使我安装了EurekaLog,它指出了code.yay中的内存泄漏!

我不太擅长内存指针之类的东西,但Eureka在这里突出显示了这段代码,这让我思考,可能是内存未被释放的错误??

我试着在结尾处添加FreeMem,但它不起作用?

代码语言:javascript
复制
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;
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2010-01-19 02:28:03

您不能将类型转换为AnsiString,因为它们是引用计数的。

这不是更简单吗?

代码语言:javascript
复制
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
EN

Stack Overflow用户

发布于 2010-01-19 02:34:33

科内尔的想法是对的。您可以进一步简化它,如下所示:

代码语言:javascript
复制
function TMidifile.ReadString(F: integer): AnsiString; 
begin
  SetLength(Result, F);
  Move(ChunkIndex^, result[1], F);
  inc(chuncIndex, F);
end;

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

票数 3
EN

Stack Overflow用户

发布于 2010-01-19 02:27:45

问题是,您不能将一堆随机字节转换为stringstring有一个特定的结构,分配由编译器管理。

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2088216

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档