调用 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;