调用ShowMessage时如何修复内存泄漏?
我有这样的代码:
ShowMessage(Memo1.Lines.GetText);
ShowMessage(Memo1.Lines.GetText);
Delphi 告诉我该代码导致泄漏:
我尝试使用以下代码修复它:
它以某种方式工作,但是此后程序会自动强制关闭。
在这种情况下有没有办法避免内存泄漏?
回答
根据文档,该TStrings.GetText()方法返回一个PChar指向动态分配的缓冲区的指针,该缓冲区必须使用 释放StrDispose():
分配一个文本缓冲区并用
Text属性值填充它 。...调用者负责使用该
StrDispose过程释放返回值。
在将它分配给string变量后,您没有释放该缓冲区,因此内存泄漏与ShowMessage()它本身无关。
为了解决这个问题,你的代码需要看起来更像这样:
var
Message: PChar;
begin
Message := Memo1.Lines.GetText;
try
ShowMessage(Message);
finally
StrDispose(Message);
end;
end;
更好的选择是使用TStrings.TextorTControl.Text属性而不是TStrings.GetText()方法。编译器可以为您管理分配的内存:
var
Message: string;
begin
Message := Memo1.Lines.Text;
// or: Message := Memo1.Text;
ShowMessage(Message);
end;
- Or just `ShowMessage(Memo1.Text);`