内存泄漏之GPS报文解析

最近项目接近尾声,7*48h老化时发现会闪退。解决这个问题废了好久的时间。

首先推荐64bit环境下内存泄漏检测工具:Dr. Memory  2.5.0.0 ,把运行程序直接拖进去即可.

#if ENABLE_GGA
// GGA数据解析
static GGA gga_data_parse(char *gga_data)
{
    GGA gga;
    unsigned char times = 0;
    char *p;
    //char *end;
    char *s = strdup(gga_data);//字符串拷贝库函数
 
    p = strsplit(&s, ",");
    while (p)
    {
        switch (times)
        {
            case 1:   // UTC
                strcpy_s(gga.utc,sizeof(gga.utc), p);
                break;
            case 2:   // lat
                gga.latitude = strtod(p, NULL);
                break;
            case 3:   // lat dir
                gga.latitude_dir = p[0];
                break;
            case 4:   // lon
                gga.longtude = strtod(p, NULL);
                break;
            case 5:   // lon dir
                gga.longtude_dir = p[0];
                break;
            case 6:   // quality
                gga.quality = (unsigned char)strtol(p, NULL, 10);
                break;
            case 7:   // sats
                gga.sats = (unsigned char)strtol(p, NULL, 10);
                break;
            case 8:   // hdop
                gga.hdop = (unsigned char)strtol(p, NULL, 10);
                break;
            case 9:   // alt
                gga.alt = strtof(p, NULL);
                break;
            case 11:  // undulation
                gga.undulation = strtof(p, NULL);
                break;
            case 13:  // age
                gga.age = (unsigned char)strtol(p, NULL, 10);
                break;
            case 14:  // stn_ID
                /*
                end = (char *)malloc(sizeof(p));
                strncpy(end, p, strlen(p)-3);
                end[strlen(p)-3] = '\0';
                gga.stn_ID = (unsigned short )strtol(end, NULL, 10);
                free(end);
                */
                break;
            default:
                break;
        }
        p = strsplit(&s, ",");
        times++;
    }
    free(s);
    return gga;
}
#endif

看代码,开始把GPS的信息给了指针s; char *s = strdup(gga_data);

 /*
    strdup 将字符串复制到新建立的空间,该函数会先用malloc()配置与参数str字符串相同的空间大小,    然后将参数str字符串的内容复制到该内存地址,然后把该地址返回。该地址最后可以利用free()来释放.
    */

free(s),最后用free来释放这块内存。但是运行24小时后,程序会闪退!

仔细查找后发现  用到了 strsplit,字符串分割函数。 p = strsplit(&s, ",");//字符串分割

代码改为:

 #if ENABLE_GGA
// GGA数据解析
static GGA gga_data_parse(char *gga_data)
{
    GGA gga;
    unsigned char times = 0;
    char *p;
    //char *end;
    char *s = strdup(gga_data);//字符串拷贝库函数
    char *Orgs = s;

    p = strsplit(&s, ",");
    while (p)
    {
        switch (times)
        {
            case 1:   // UTC
                strcpy_s(gga.utc,sizeof(gga.utc), p);
                break;
            case 2:   // lat
                gga.latitude = strtod(p, NULL);
                break;
            case 3:   // lat dir
                gga.latitude_dir = p[0];
                break;
            case 4:   // lon
                gga.longtude = strtod(p, NULL);
                break;
            case 5:   // lon dir
                gga.longtude_dir = p[0];
                break;
            case 6:   // quality
                gga.quality = (unsigned char)strtol(p, NULL, 10);
                break;
            case 7:   // sats
                gga.sats = (unsigned char)strtol(p, NULL, 10);
                break;
            case 8:   // hdop
                gga.hdop = (unsigned char)strtol(p, NULL, 10);
                break;
            case 9:   // alt
                gga.alt = strtof(p, NULL);
                break;
            case 11:  // undulation
                gga.undulation = strtof(p, NULL);
                break;
            case 13:  // age
                gga.age = (unsigned char)strtol(p, NULL, 10);
                break;
            case 14:  // stn_ID
                /*
                end = (char *)malloc(sizeof(p));
                strncpy(end, p, strlen(p)-3);
                end[strlen(p)-3] = '\0';
                gga.stn_ID = (unsigned short )strtol(end, NULL, 10);
                free(end);
                */
                break;
            default:
                break;
        }
        p = strsplit(&s, ",");
        times++;
    }
    free(Orgs);
    return gga;
}
#endif

一切正常!7*24小时后 内存无增加,还是保持在两位数的范围内。

总结:strsplit会改变s的值,所以最后free的内存块与分配的不符;

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值