lvgl 9.3 style使用导致内存泄漏问题

lvgl切换界面的时候发屏内存泄漏的问题,

打开自带的内存占用显示的控件,占用的内存一直变大
使用官方自带的PC模拟器,输出内存使用情况下,确实存在内存占用越来越大的情况
串口输出时free的空间在逐渐变小

异常输出信息

memory_leak

定位

刚开始以为是创建跟销毁界面时,需要调用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可能就是一个新的内存申请操作
0e6cc2db-f8fe-4d2b-9aba-dd4fbb26289a

处理方式

需要在销毁界面的时,需要将设置的sytle变量,进行reset,来达到释放内存的效果。 否则内存就一直在被占用,而没有释放

	lv_style_reset(&s_focus);

lv_style_reset有相应的释放内存的操作
1db8a977-5a29-416a-8cf6-0bc78516420c

正常输出信息

memory_no_leak

信息输出大致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();
}

参考

lvgl中存在的内存泄漏问题

posted @ 2025-09-25 17:39  cau_par  阅读(14)  评论(0)    收藏  举报