gpt4 book ai didi

delphi - LoadIcon() 是否可能发生内存泄漏?

转载 作者:行者123 更新时间:2023-12-03 15:07:40 25 4
gpt4 key购买 nike

我使用此代码为线程中的托盘图标设置动画(icon1 和 icon2 位于 .res 文件中):

while AnimationPending do
begin
TrayIcon.Icon.Handle := LoadIcon(hInstance,'icon1');
Sleep(300);
TrayIcon.Icon.Handle := LoadIcon(hInstance,'icon2');
Sleep(300);
end;

我担心如果我在循环中执行此操作,可能会造成内存泄漏,因为 icon1/2 会重新加载。

代码是否会造成内存泄漏,或者在循环中使用是否安全?

最佳答案

您正在调用LoadIcon。这会返回所谓的共享图标。 DestroyIcon 的文档对此进行了解释。成为共享图标的后果之一是您不需要调用 DestroyIcon

It is only necessary to call DestroyIcon for icons and cursors created with the following functions: CreateIconFromResourceEx (if called without the LR_SHARED flag), CreateIconIndirect, and CopyIcon. Do not use this function to destroy a shared icon. A shared icon is valid as long as the module from which it was loaded remains in memory. The following functions obtain a shared icon.

  • LoadIcon
  • LoadImage (if you use the LR_SHARED flag)
  • CopyImage (if you use the LR_COPYRETURNORG flag and the hImage parameter is a shared icon)
  • CreateIconFromResource
  • CreateIconFromResourceEx (if you use the LR_SHARED flag)

那么,这与您的代码有何关系?好吧,当你写

TrayIcon.Icon.Handle := LoadIcon(hInstance,'icon1');

您正在分配给 TIcon 对象的 Handle 属性。如果该 TIcon 对象已包含一个图标,则该图标将在被新图标替换之前被销毁。这是因为 TIcon 拥有其图标句柄的所有权。所有这些意味着上面的代码行会调用 DestroyIcon 来获取共享图标。 MSDN 告诉你不要这样做,但事实证明这是良性的。没什么可担心的。

现在,即使您使用返回非共享图标的函数,例如CreateIconIndirect 那么您的代码就不会泄漏图标句柄。这是因为 TIcon 类取得了图标句柄的所有权。

但是由于您使用的是共享图标,因此甚至不可能泄漏这些句柄。无法销毁的对象就无法泄露!

还有一些要点:

  1. 我个人不会像这样一遍又一遍地调用LoadIcon。我会在程序启动时调用它两次并记住共享图标句柄。然后我将使用这些句柄分配给 TrayIcon.Icon.Handle
  2. 当您调用LoadIcon时,您对返回的图标的大小没有太多控制权。我认为您可能会得到一个大图标而不是小图标。在显示之前需要将其缩放到小图标尺寸。创建通知区域图标时,应确保它们的大小为 SM_CXSMICONSM_CYSMICON

关于delphi - LoadIcon() 是否可能发生内存泄漏?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15556817/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com