搜索
bottom↓
回复: 4

报告一个系统内存泄漏的BUG

[复制链接]

出0入0汤圆

发表于 2011-1-20 09:07:31 | 显示全部楼层 |阅读模式
使用文件系统的汉字库显示汉字的时候,系统用到了64个汉字的缓存作为当前显示的汉字点阵区,当有新的汉字要显示时,则会向系统先查询在当前的缓存区是否已经存在该汉字,如果没有,则会向申请一个汉字的缓存区,同时把该汉字的图形读入到申请的缓存中,

static rt_uint8_t* _font_cache_get(struct rtgui_hz_file_font* font, rt_uint16_t hz_id)
{
    rt_uint32_t seek;
    struct hz_cache *cache, search;

    search.hz_id = hz_id;
    cache = SPLAY_FIND(cache_tree, &(font->cache_root), &search);
    if (cache != RT_NULL)
    {
        /* find it */
        return (rt_uint8_t*)(cache + 1);
    }
/* can not find it, load to cache */
    cache = (struct hz_cache*) rtgui_malloc(sizeof(struct hz_cache) + font->font_data_size);
    if (cache == RT_NULL) return RT_NULL; /* no memory yet */

    cache->hz_id = hz_id;
    seek = 94 * (((hz_id & 0xff) - 0xA0) - 1) + ((hz_id >> 8) - 0xA0) - 1;
    seek *= font->font_data_size;

    /* read hz font data */
    if ((lseek(font->fd, seek, SEEK_SET) < 0) ||
        read(font->fd, (char*)(cache + 1), font->font_data_size) !=
        font->font_data_size)
    {
        rtgui_free(cache);
        return RT_NULL;
    }

    /* insert to cache */
    SPLAY_INSERT(cache_tree, &(font->cache_root), cache);
        font->cache_size ++;

    if (font->cache_size > HZ_CACHE_MAX)
    {
        /* remove a cache */
        struct hz_cache* left;
        left = font->cache_root.sph_root;
        while (SPLAY_LEFT(left, hz_node) != RT_NULL) left = SPLAY_LEFT(left, hz_node);

        /* remove the left node */
        SPLAY_REMOVE(cache_tree, &(font->cache_root), left);
        font->cache_size --;
    }

    return (rt_uint8_t*)(cache + 1);
}

如果缓存区的大小超过了HZ_CACHE_MAX,则在最后插入新加的汉字,同时移走一个汉字,问题就是向系统申请了新的内存,却没有把移走的汉字内存释放,应该在SPLAY_REMOVE(cache_tree, &(font->cache_root), left);后加入 rtgui_free(left);,这样内存才不会不断泄露。

阿莫论坛20周年了!感谢大家的支持与爱护!!

曾经有一段真挚的爱情摆在我的面前,我没有珍惜,现在想起来,还好我没有珍惜……

出0入0汤圆

发表于 2011-1-20 10:44:05 | 显示全部楼层
是的,这个是个bug,谢谢。这个bug你在QQ上已经回报了吗?上次听谁说过一次了,一直还没时间来修复。有bug以后提交到google issue那边吧,记得抄送一份给我,谢谢。

出0入0汤圆

 楼主| 发表于 2011-1-20 21:32:47 | 显示全部楼层
QQ?是QQ群吗?怎么提交呢?

出0入0汤圆

发表于 2011-1-20 23:16:45 | 显示全部楼层
已经修复了,见最新的svn版本。欢迎回报更多的bug,这段时间会把GUI的问题进行修正,并把一些设计问题给解决(例如那个鼠标释放动作在目标区域外,目标控件无法响应的问题)。

出0入0汤圆

 楼主| 发表于 2011-1-21 00:03:43 | 显示全部楼层
好的,也碰到了这样的问题,下载解决下,辛苦了
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片。注意:要连续压缩2次才能满足要求!!】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-8-26 08:49

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

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