使用cjson解析json数据,在使用过程中发现有很多网友说运行一段时间,会造成内存申请失败,死机等情况,我也遇到了内存申请失败的问题,后来发现了如下几个问题
1.申请了内存没有释放 造成内存申请失败,下面记录下使用的注意问题
(1)使用root = cJSON_Parse(text); //将文本转成json格式,次函数里面申请了一块内存给root 所以在最后要释放root
cJSON_Delete(root ); //释放cJSON_Parse()分配出来的内存空间
注意:创建获取object失败了,也要释放掉!!!!
if(!root){
cJSON_Delete(root);
return -1;
}else{
cJSON * object = cJSON_GetObjectItem(root,"params");
if(!object){
cJSON_Delete(root);
return -1;
}
(2)使用out = cJSON_Print(root);//次函数将json数据转成字符串,这个函数内申请了一段内存给out,所以使用完out后也要释放
由于out不是json指针的数据格式所以使用cJSON_free(out);释放就可以,不要使用free,官方给的示例使用free,但是我们自己使用的时候可能已经移植了cjson到不同的平台,free就不一定适用。
(3)使用cJSON *new_json_str = cJSON_CreateString(str);//将一个字符串转成一个json对象,函数里面也涉及了内存分配,座椅用完以后也要释放cJSON_Delete(new_json_str );
暂时只用到上面几条,所以就发现了这几个,如果有朋友知道可以留言补充。总之就是在使用cjson函数时一定要看看函数内有没有涉及到内存申请,如果有在使用完以后一定释放。这样cjson用起来还是很方便的。
2.内存申请后内存指针变动,在释放的时候指针有偏移,造成内存释放不彻底,这种情况我没有仔细去测试,只是在原子论坛看到有网友这样解决的,也一起记录下来:链接http://www.openedv.com/forum.php?mod=viewthread&tid=229818&page=3
可以通过这个帖子了解