這兩句代碼會LEAK ? s := TfAppMain.ClassName; wh := FindWindow(pansichar(s), nil)

  • 主题发起人 主题发起人 hsgrass
  • 开始时间 开始时间
H

hsgrass

Unregistered / Unconfirmed
GUEST, unregistred user!
這兩句代碼會LEAK ? s := TfAppMain.ClassName
wh := FindWindow(pansichar(s), nil);(100分)
<br />// fastmm4經常彈出一個小LEAK的提示,是下面的代碼引起的,
// 問: 什麽原因?
s: string;
begin
s := TfAppMain.ClassName;
wh := FindWindow(pansichar(s), nil);
// 在這裏dispose會出錯, 上面的不是引用嗎?
end;
 
wh := FindWindow(pansichar(s), nil);
//这里不用再Dispose了,因为实际上PAnsiChar(S)就是引用了S的地址而已,S是String,内存管理器会自动处理有关分配和释放的问题。
 
有DISPOSE出現地址錯
沒有DISPOSE出現内存leak( fastmm4提示, cnMemproof也是)
 
试下这样,自己处理分配和DISPOSE
var s:pchar;
.
.
StrDispose(s);

这问题我以前研究过,
MS的相关资料的一种说法是:
使用引用参数或com对象内部的串,
必须自己负责其分配释放,
但是也没有什么具体的解决方法,
还是要靠自己多检查下,
有时候影响不大的就不管了,
赶进度要紧,
虽然心里总不舒服。

你这个代码应该没什么问题,
因为string是分配了内存的,
只是做了复制,
但是强制转化为pchar的时候,
转成了指针,检查工具对pchar比较敏感,
如果直接用pchar, 显式分配和dispose,
看起来这样的处理就比较清晰了
 
Delphi对局部String变量的管理是很完善的。我用MemProof监视,多次执行(循环调用整
个过程10000次),没有发现任何内存泄漏。
设定断点,运行时查看汇编代码,会发现在ret之前,有几个 call @LStrClr ——它释放
了局部字符串的。
 
多人接受答案了。
 
后退
顶部