最近项目接近尾声,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小时后 内存无增加,还是保持在两位数的范围内。