使用Cjson解析造成内存溢出的解决办法

最近使用cjson解析json数据,在使用过程中发现有很多网友说运行一段时间,会造成内存申请失败,死机等情况,我也遇到了内存申请失败的问题,后来发现了如下几个问题

1.申请了内存没有释放 造成内存申请失败,下面记录下使用的注意问题

(1)使用root = cJSON_Parse(text); //将文本转成json格式,次函数里面申请了一块内存给root  所以在最后要释放root

 cJSON_Delete(root ); //释放cJSON_Parse()分配出来的内存空间

(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

可以通过这个帖子了解

 

  • 11
    点赞
  • 32
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
在 UC/OS-II 中使用 cJSON 时,你可以配置动态内存管理器来分配和释放 cJSON 对象所需的内存。以下是一种可能的方式来配置动态内存管理器: 1. 在你的 UC/OS-II 项目中,定义一个全局的动态内存管理器(例如,使用堆或内存池)来分配和释放 cJSON 对象所需的内存。你可以使用 UC/OS-II 提供的内存管理函数,如 `OSMemCreate()`、`OSMemGetBlock()` 和 `OSMemPutBlock()`,或者自己实现一个内存管理器。 下面是一个使用堆来分配和释放 cJSON 对象内存的示例: ```c #include "cJSON.h" #include "os_cfg.h" #include "ucos_ii.h" #define JSON_MEM_SIZE 1024 // 定义堆大小 OS_MEM jsonMem; // 声明一个内存块对象 void YourTask(void *p_arg) { void *jsonBuf; // 创建一个内存块,用于分配 cJSON 对象的内存 OSMemCreate(&jsonMem, "JSON Memory", jsonBuf, JSON_MEM_SIZE, sizeof(cJSON), NULL); // 在任务中使用 cJSON cJSON *root = NULL; char *jsonStr = "{\"name\":\"John\",\"age\":30,\"city\":\"New York\"}"; // 分配 cJSON 对象内存 root = (cJSON *)OSMemGetBlock(&jsonMem); if (root != NULL) { // 解析 JSON 字符串 root = cJSON_Parse(jsonStr); if (root != NULL) { // 其他操作... // 释放 cJSON 对象内存 OSMemPutBlock(&jsonMem, root); } } // 其他任务代码... } ``` 在上述示例中,首先定义了一个内存块 `jsonMem`,用于分配 cJSON 对象的内存。然后,在任务中使用 `OSMemGetBlock()` 函数从内存块中获取一个 cJSON 对象的内存,并在使用完后使用 `OSMemPutBlock()` 函数将其释放回内存块。 请注意,这只是一种示例配置方式,你可以根据你的需求和系统资源情况进行适当的调整和修改。 希望对你有所帮助!
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值