lvgl切换界面的时候发屏内存泄漏的问题,
打开自带的内存占用显示的控件,占用的内存一直变大
使用官方自带的PC模拟器,输出内存使用情况下,确实存在内存占用越来越大的情况
串口输出时free的空间在逐渐变小
异常输出信息
定位
刚开始以为是创建跟销毁界面时,需要调用create跟delete这样的接口,这些接口存在,申请内存跟释放内存的操作,可能是哪里申请与释放没有对应上,导致内存泄漏
使用lv_style_t这个style样式,修改显示效果的时候,处理不当会引起内存泄漏
在对BUTTON进行,style设置的时候,需要销毁界面的时候,会将create的BUTTON删除掉,但却没有对style添加的参数进行删除,导致内存泄漏
static lv_style_t s_focus;lv_style_init(&s_focus);lv_style_set_bg_color(&s_focus, lv_color_hex(0x00ff00));
只要调用了lv_style_set_xx_xx这样的接口,就会申请内存
这个lv_realloc可能就是一个新的内存申请操作
处理方式
需要在销毁界面的时,需要将设置的sytle变量,进行reset,来达到释放内存的效果。 否则内存就一直在被占用,而没有释放
lv_style_reset(&s_focus);
lv_style_reset有相应的释放内存的操作
正常输出信息
信息输出大致DEMO代码
static void print_mem_status(void)
{lv_mem_monitor_t mon;lv_mem_monitor(&mon);printf("[MEM] free:%lu used:%lu max_used:%lu frag:%d%%\n",(unsigned long)mon.free_size,(unsigned long)(mon.total_size - mon.free_size),(unsigned long)mon.max_used,mon.frag_pct);
}/* 切换界面的定时器回调 */
static void switch_cb(lv_timer_t * t)
{switch_cnt++;if(switch_cnt % 2 == 0) {view_switch(1);} else {view_switch(2);}/* 每次切换后打印一次内存状态 */print_mem_status();
}/* 初始化 demo */
void lv_demo_mem_monitor(void)
{view_switch(1);switch_timer = lv_timer_create(switch_cb, 500, NULL);/* 打印初始状态 */print_mem_status();
}