【问题标题】:How to fix memory leak when calling ShowMessage?调用 ShowMessage 时如何修复内存泄漏?
【发布时间】:2021-05-25 14:00:57
【问题描述】:

我有这样的代码:

ShowMessage(Memo1.Lines.GetText);

Delphi 告诉我该代码导致了泄漏:

我尝试使用以下代码修复它:

var
  Message:string;
begin
  Message := Memo1.Lines.GetText;
  try
    ShowMessage(Message);
  finally
    FreeAndNil(Message)
  end;

它以某种方式工作,但之后程序会自动强制关闭。

有没有办法避免这种情况下的内存泄漏?

【问题讨论】:

  • 不要尝试释放字符串。字符串是自动管理的。
  • @Olivier 感谢您的回答。好吧,有什么办法可以避免内存泄漏的消息吗?我很困惑。或者我应该忽略这条消息?谢谢
  • 你确定泄漏是由ShowMessage()引起的吗?不应该。
  • 如果将Memo1.Lines.GetText 更改为Memo1.Lines.Text 会怎样?
  • @Olivier 我不太确定。如果我使用特定值而不是 Memo1.Lines.GetText 它不会显示内存泄漏消息。

标签: delphi


【解决方案1】:

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.TextTControl.Text 属性而不是TStrings.GetText() 方法。编译器可以为你管理分配的内存:

var
  Message: string;
begin
  Message := Memo1.Lines.Text;
  // or: Message := Memo1.Text;
  ShowMessage(Message);
end;

【讨论】:

  • 非常感谢先生,我今天学到了新东西。
  • 或者只是ShowMessage(Memo1.Text);
  • @StefanGlienke 添加了
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-01-12
  • 2014-06-24
  • 2018-05-09
  • 2018-07-12
  • 2012-09-14
  • 2020-05-24
相关资源
最近更新 更多