调用 ShowMessage 时如何修复内存泄漏?
How to fix memory leak when calling ShowMessage?
我有这样的代码:
ShowMessage(Memo1.Lines.GetText);
Delphi 告诉我该代码导致泄漏:
我尝试使用以下代码修复它:
var
Message:string;
begin
Message := Memo1.Lines.GetText;
try
ShowMessage(Message);
finally
FreeAndNil(Message)
end;
它以某种方式工作,但此后程序会自动强制关闭。
在这种情况下有没有办法避免内存泄漏?
TStrings.GetText()
method returns a PChar
pointer to a dynamically allocated buffer which must be freed with StrDispose()
,根据文档:
Allocates a text buffer and fills it with the value of the Text
property.
... The caller is responsible for freeing the returned value using the StrDispose
procedure.
将缓冲区分配给 string
变量后,您没有释放该缓冲区,因此发生了内存泄漏,这与 ShowMessage()
本身无关。
要解决这个问题,您的代码需要看起来更像这样:
var
Message: PChar;
begin
Message := Memo1.Lines.GetText;
try
ShowMessage(Message);
finally
StrDispose(Message);
end;
end;
更好的选择是使用 TStrings.Text
or TControl.Text
属性 而不是 TStrings.GetText()
方法。编译器可以为您管理分配的内存:
var
Message: string;
begin
Message := Memo1.Lines.Text;
// or: Message := Memo1.Text;
ShowMessage(Message);
end;
我有这样的代码:
ShowMessage(Memo1.Lines.GetText);
Delphi 告诉我该代码导致泄漏:
我尝试使用以下代码修复它:
var
Message:string;
begin
Message := Memo1.Lines.GetText;
try
ShowMessage(Message);
finally
FreeAndNil(Message)
end;
它以某种方式工作,但此后程序会自动强制关闭。
在这种情况下有没有办法避免内存泄漏?
TStrings.GetText()
method returns a PChar
pointer to a dynamically allocated buffer which must be freed with StrDispose()
,根据文档:
Allocates a text buffer and fills it with the value of the
Text
property.... The caller is responsible for freeing the returned value using the
StrDispose
procedure.
将缓冲区分配给 string
变量后,您没有释放该缓冲区,因此发生了内存泄漏,这与 ShowMessage()
本身无关。
要解决这个问题,您的代码需要看起来更像这样:
var
Message: PChar;
begin
Message := Memo1.Lines.GetText;
try
ShowMessage(Message);
finally
StrDispose(Message);
end;
end;
更好的选择是使用 TStrings.Text
or TControl.Text
属性 而不是 TStrings.GetText()
方法。编译器可以为您管理分配的内存:
var
Message: string;
begin
Message := Memo1.Lines.Text;
// or: Message := Memo1.Text;
ShowMessage(Message);
end;