lvgl中存在的内存泄漏问题

news/2025/3/1 7:58:54/文章来源:https://www.cnblogs.com/shumei52/p/18605051

此篇文章在2024年5月24日被记录

在lvgl中,当两个页面之间互相切换时,先将第一个页面的控件全部删除,在创建新页面的控件,但是有时执行后会发现会出现内存泄漏:两个页面来回切换,内存占用不断提高,直到卡死。

1、情况复现

使用最简单的方式复现问题,模拟器新建两个页面,每个页面在创建时新建一个style对控件进行修饰,不断切换页面后,内存占用会不断升高
现象截图:

img

测试代码:

static lv_style_t style ;
static lv_obj_t * page1_obj ;
static lv_obj_t * page2_obj ;
static uint8_t page = 0 ;
void log_get_lvgl_mem(void)
{lv_mem_monitor_t mon;lv_mem_monitor(&mon);uint32_t used_size = mon.total_size - mon.free_size;uint32_t used_kb = used_size / 1024;uint32_t used_kb_tenth = (used_size - (used_kb * 1024)) / 102;printf("%"LV_PRIu32 ".%"LV_PRIu32 " kB used (%d %%)\n""%d%% frag.",used_kb, used_kb_tenth, mon.used_pct,mon.frag_pct);
}
static void event_handler(lv_event_t * e)
{lv_obj_t * obj = lv_event_get_target(e);lv_event_code_t code = lv_event_get_code(e);if(LV_EVENT_CLICKED == code){// lv_style_reset(&style);if(0 == page){page = 1 ;lv_obj_clean(lv_scr_act());test_creaty_page_2();log_get_lvgl_mem();printf("\r\nchange to page2\r\n");}else if(1 == page){page = 0 ;lv_obj_clean(lv_scr_act());test_creaty_page_1();log_get_lvgl_mem();printf("\r\nchange to page1\r\n");}else{printf("error!\r\n");}}
}void test_creaty_page_1(void)
{lv_style_init(&style);lv_style_reset(&style);lv_style_set_radius(&style, 10);lv_style_set_border_side(&style, LV_BORDER_SIDE_NONE);lv_style_set_bg_opa(&style, LV_OPA_COVER);lv_style_set_bg_color(&style, lv_color_make(255, 0, 0));page1_obj= lv_obj_create(lv_scr_act());lv_obj_add_style(page1_obj, &style, 0);lv_obj_set_pos(page1_obj, 0, 0);lv_obj_set_size(page1_obj, 200, 200);lv_obj_add_event_cb(page1_obj, event_handler, LV_EVENT_CLICKED, NULL);
}
void test_creaty_page_2(void)
{lv_style_init(&style);lv_style_reset(&style);lv_style_set_radius(&style, 10);lv_style_set_border_side(&style, LV_BORDER_SIDE_NONE);lv_style_set_bg_opa(&style, LV_OPA_COVER);lv_style_set_bg_color(&style, lv_color_make(0, 255, 0));page2_obj= lv_obj_create(lv_scr_act());lv_obj_add_style(page2_obj, &style, 0);lv_obj_set_pos(page2_obj, 0, 0);lv_obj_set_size(page2_obj, 200, 200);lv_obj_add_event_cb(page2_obj, event_handler, LV_EVENT_CLICKED, NULL);
}

2、解决办法

每次在页面切换时,使用接口将style其释放
解决代码:
取消注释event_handler中的lv_style_reset(&style);
现象:

img

3、总结

  • 造成内存泄露的核心原因是用户创建的style没有释放,因此在页面切换时不要忘记释放用户定义的style
  • 如果这个style修饰了多个对象,切换界面时释放style仍然会造成内存泄漏,因此在动态界面切换过程中,一个style最好只用来修饰一个界面,除非你知道你正在做什么
  • lvgl的style注释中也详细交代了Do not call lv_style_init on styles that already have some properties because this function won't free the used memory, just sets a default state for the style. In other words be sure to initialize styles only once!
  • 在开发阶段可以尽量多的依赖lvgl的调试宏开关
    • ·#define LV_USE_LOG 1 开启log开关
    • ·#define LV_USE_ASSERT_MALLOC 1 如果内存耗尽,会进入断言
    • ·define LV_USE_ASSERT_STYLE 1 如果出现了style重新初始化,会打印log提醒(本文核心)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/851931.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

基于米尔全志T527开发板的OpenCV进行手势识别方案

本文将介绍基于米尔电子MYD-LT527开发板(米尔基于全志T527开发板)的OpenCV手势识别方案测试。 摘自优秀创作者-小火苗米尔基于全志T527开发板一、软件环境安装 1.安装OpenCV sudo apt-get install libopencv-dev python3-opencv2.安装pip sudo apt-get install python3-pip二…

智慧工地算法视频分析服务器视频监控接入后,常见的视频干扰故障有哪些?

在视频监控系统的安装和维护过程中,我们经常会遇到各种技术问题,这些问题可能会影响监控图像的质量和系统的稳定性。为了确保监控系统的有效性和可靠性,了解这些常见问题及其解决方法是非常重要的。 本文将详细介绍一些监控系统中常见的图像干扰和画面问题,并提供相应的解决…

云之家:人事经理制作考勤打卡设置

云之家:人事经理制作考勤打卡设置云之家:人事经理制作考勤打卡设置打开云之家,登录后,打开 签到 点击签到。进去 新增 填写即可 设置 签到 这两个都可以设置签到。讲 排班签到组---新增 欢迎你的观看,一起学习代码。

AI智能分析视频分析网关接入室外监控摄像头,经常遇到的问题有哪些?

在现代安全监控系统中,室外监控摄像头扮演着至关重要的角色,它们为我们提供了实时监控的能力,帮助我们保护财产和人身安全。然而,室外监控摄像头在使用过程中可能会遇到各种技术和环境相关的挑战。 本文将探讨室外监控摄像头在使用过程中常见的一些问题及其解决方案,帮助大…

三维坐标旋转矩阵推导过程以及C语言实现

此篇文章在2023年9月13日被记录前提: 坐标使用右手坐标系,角度逆时针旋转为正。 绕X轴旋转角度为 俯仰角 即Pitch 绕Y轴旋转角度为 偏航角 即Yaw(Head) 绕Z轴旋转角度为 翻滚角 即Roll1、平面二维坐标点的旋转根据三角函数关系,可以列出向量OP与OP的坐标表示形式: x = |O…

HLOB:限价订单簿中的信息持久性和结构

https://zhuanlan.zhihu.com/p/718659516 本文介绍了一个名为HLOB的新型大规模深度学习模型,用于预测限价订单簿中间价格的变化。该模型利用信息过滤网络(特别是三角最大化过滤图)来揭示订单簿中不同成交量水平间的深层和非平凡依赖结构,并通过同调卷积神经网络的设计选择来…

面向智能汽车的以太网开发与测试解决方案

通过参与多个项目的实践经验,经纬恒润已经建立了一套高质量且本土化的设计与测试一体化解决方案,为整车网络架构提供可靠的保障。此外,随着智能化、网联化和电子电气架构的变革,经纬恒润积极扩展业务范围,在TSN、SOA和HPC、多G和10M以太网等前沿领域也取得了显著成果。概述…

嵌入式必备知识-IIC协议

此篇文章在2023年8月8日被记录1、概述 IIC(Inter-IntegratedCircuit)总线是一种由PHILIPS公司开发的两线式串行总线,用于连接微控制器以及其外围设备,IIC也被称为I2C,其实两者是完全相同的。它是由数据线SDA和时钟线SCL构成的串行总线,可发送和接收数据。两根线定义如下:数…

优化项目管理:提升企业效率与竞争力的策略

随着智能化、自动化技术的飞速发展,项目管理领域正经历着前所未有的变革。未来的项目管理将更加注重智能化和自动化,旨在提高管理效率、降低运营成本,并更好地应对复杂多变的市场环境。企业应积极拥抱这些新技术,探索项目管理的新模式和新方法,以适应未来市场的变化和挑战…

记录一个开源的物理引擎:Physac

此篇文章在2023年7月27日被记录1、Physac介绍 Physac是一个开源的物理引擎,所有代码实现在头文件中,仅仅有2100行代码,移植接口只需要一个画线函数,因此很容易移植到嵌入式设备等,GitHub地址为https://github.com/victorfisac/Physac 2、引擎接口 引擎具有以下特性:可以动…

嵌入式组件-----状态机

此篇文章在2023年7月10日被记录1、简述状态机 在C语言编程中,可以使用状态机来实现复杂的控制流程和状态管理。 状态机通常由以下几个组成部分构成:状态(State):系统或程序可能处于的不同状态,例如"待机"、"运行"、"暂停"等。每个状态代表…

达梦数据库系列教程01---数据库备份与还原

一、备份数据库 1、右键服务器管理,打开如下的页面,选配置,再点转换2、归档配置修改,选“归档”,填一个归档目档 3、再次选择“系统管理”,将态管理选中“打开”,再点转换 4、备份---》库备份----》新建备份 二、还原数据库