硬汉嵌入式论坛

 找回密码
 立即注册
查看: 195|回复: 7
收起左侧

[emWin] 使用WM_CreateWindowAsChild连续创建窗体出现每次消耗的内存不一致

[复制链接]

1

主题

3

回帖

6

积分

新手上路

积分
6
发表于 2025-6-18 21:44:53 | 显示全部楼层 |阅读模式
无意中发现个问题,当循环创建窗体后再依次删除,用GUI_ALLOC_GetNumFreeBytes查看内存分配发现有“泄露”,观察了每次创建和删除的内存使用发现创建的时候会出现比释放多消耗的情况,有遇到过类似问题的大佬吗,会是什么原因呢?

  int mem_before = GUI_ALLOC_GetNumFreeBytes();
  int mem_creation[5];
  int mem_free[5];
  GUI_HWIN hwnd[5];
  for (int i = 0; i < 5; i++) {
      mem_creation[i] = GUI_ALLOC_GetNumFreeBytes();
      hwnd[i] = WM_CreateWindowAsChild(10, 50, 145, 40, _hWindow1, WM_CF_SHOW | WM_CF_MEMDEV, _cbChild, 0);
      mem_creation[i] -= GUI_ALLOC_GetNumFreeBytes();
  }
  for (int i = 0; i < 5; i++) {
      mem_free[i] = GUI_ALLOC_GetNumFreeBytes();
      WM_DeleteWindow(hwnd[i]);
      mem_free[i] = GUI_ALLOC_GetNumFreeBytes() - mem_free[i];
  }
  int mem_after = GUI_ALLOC_GetNumFreeBytes();
  int mem_diff = mem_before - mem_after;

mem_creation 0x15f0f904 {60, 92, 60, 60, 60}
mem_free 0x15f0f8e8 {60, 60, 60, 60, 60}
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
116767
QQ
发表于 2025-6-19 09:50:07 | 显示全部楼层
这样测试看看,创建并删除10次,20次,50次,100次。

仅看最终剩余,看看是不是一直在减小,另外每次结束后调用下GUI_Exec
回复

使用道具 举报

1

主题

3

回帖

6

积分

新手上路

积分
6
 楼主| 发表于 2025-6-19 10:49:54 | 显示全部楼层
eric2013 发表于 2025-6-19 09:50
这样测试看看,创建并删除10次,20次,50次,100次。

仅看最终剩余,看看是不是一直在减小,另外每次结 ...

创建完就删除窗体是没问题的,测试过,而且每次的内存消耗也一致,但是连续创建完再删除就是不行,在开发板上也测试过,同样现象,创建完也调用过Exc和Delay试过,貌似情况更糟……
回复

使用道具 举报

0

主题

1

回帖

1

积分

新手上路

积分
1
发表于 2025-6-19 10:50:36 | 显示全部楼层
插个眼
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
116767
QQ
发表于 2025-6-20 13:55:23 | 显示全部楼层
98440622 发表于 2025-6-19 10:49
创建完就删除窗体是没问题的,测试过,而且每次的内存消耗也一致,但是连续创建完再删除就是不行,在开发 ...

我的意思是连续创建10次,执行GUI_Exec,连续删除10,这样测试,也有问题吗。

注意你的这个WM_CreateWindowAsChild不要添加任何组件,方便起见,这个参数_cbChild改为0,即

hwnd = WM_CreateWindowAsChild(10, 50, 145, 40, _hWindow1, WM_CF_SHOW | WM_CF_MEMDEV, 0, 0);
回复

使用道具 举报

1

主题

3

回帖

6

积分

新手上路

积分
6
 楼主| 发表于 2025-6-20 15:30:30 | 显示全部楼层
eric2013 发表于 2025-6-20 13:55
我的意思是连续创建10次,执行GUI_Exec,连续删除10,这样测试,也有问题吗。

注意你的这个WM_CreateW ...

连续创建,再连续删除确实有“问题”的,无论是否调用exec还是有无附加数据的情况。
回复

使用道具 举报

1

主题

3

回帖

6

积分

新手上路

积分
6
 楼主| 发表于 2025-6-20 20:55:23 | 显示全部楼层
官网手册的这段应该是原因,测试下来发现确实只有第一轮会有内存没完全“释放”的问题,后面N轮同样的测试内存没有减少了
Memory in emWin is allocated in blocks. To manage these blocks, a few additional bytes are required for each block. This block overhead is located in its own memory block. Initially, this block is quite small since it only manages a few memory blocks. But this block will increase in size, e.g. when memory for a window application is required.

This overhead memory gets reused when blocks are getting deleted and created again, but it will not get freed by emWin. So this should not be mistaken as a memory leak, this is normal behavior.
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
116767
QQ
发表于 2025-6-21 08:06:24 | 显示全部楼层
98440622 发表于 2025-6-20 20:55
官网手册的这段应该是原因,测试下来发现确实只有第一轮会有内存没完全“释放”的问题,后面N轮同样的测试 ...

前面提出的测试方法就是为了测试这个问题,就是看是不是一直在减小,一直减小是不正常的,肯定有没释放的地方
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|小黑屋|Archiver|手机版|硬汉嵌入式论坛

GMT+8, 2025-7-5 19:28 , Processed in 0.263340 second(s), 25 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

快速回复 返回顶部 返回列表