加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

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

发布时间:2020-12-15 09:33:51 所属栏目:大数据 来源:网络整理
导读:我正在使用此代码为线程中的托盘图标设置动画(icon1和icon2在.res文件中): while AnimationPending dobegin TrayIcon.Icon.Handle := LoadIcon(hInstance,'icon1'); Sleep(300); TrayIcon.Icon.Handle := LoadIcon(hInstance,'icon2'); Sleep(300);end; 我
我正在使用此代码为线程中的托盘图标设置动画(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类拥有图标句柄的所有权.

但由于您使用的是共享图标,因此甚至无法泄漏这些句柄.无法破坏的物体,不能泄露!

还有一点:

>我个人不会一遍又一遍地调用LoadIcon.我会在程序启动时调用它两次并记住共享图标句柄.然后我会使用这些句柄分配给TrayIcon.Icon.Handle.>当您调用LoadIcon时,您无法控制返回的图标的大小.我认为你可能会获得一个大图标而不是一个小图标.这需要在显示之前缩放到小图标大小.创建通知区域图标时,应确保SM_CYSMICON大小为SM_CXSMICON.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读