cJSON内存管理:cJSON_Delete函数的正确使用
搞懂cJSON里内存释放的正确姿势,避开野指针和内存泄漏的常见坑。
支持通配符SSL证书、多域名证书、IP证书。适配ACME接口, 支持Zerossl、Let's Encrypt和Google等渠道。登录已有账号
2026-06-28 16:17:10 cJSON 内存管理 cJSON_Delete C语言
cJSON这个库在嵌入式里用得挺多,轻量,解析也快,但有个地方经常让人栽跟头——内存释放。
它不会帮你自动管理,解析完的JSON树你得自己删,忘掉或者删得不对,线上跑久了内存就会慢慢涨上去。
其实核心就一个函数:cJSON_Delete。当你调用cJSON_Parse把一个JSON字符串转成内部结构时,它会动态分配一整棵树,根节点连同所有子节点、值字符串什么的都从堆上拿。cJSON本身不记录这些分配,也没有垃圾回收,所以用完必须显式调用cJSON_Delete回收。
cJSON_Delete会递归地干掉根节点及其下挂的所有子节点,这意味着你只需要对着最顶上的那个根调一次就够了。
千万注意,别对同一个cJSON指针多次调用cJSON_Delete,重复释放会导致未定义行为,搞不好就直接崩了。
调用前还有一个必须养成的习惯:先判空。如果cJSON_Parse解析失败,它返回的是NULL,压根没分配内存,这时候再去cJSON_Delete就是给自己找麻烦。
另外,实际业务代码很少像demo那样一条直线走到底。如果你在处理JSON的过程中需要提前return(比如某个字段检查不通过),记得在return之前把已经解析出来的root释放掉。很多泄漏就出在这些不显眼的分支路径上。
下面是个简单例子,解析一段JSON,取几个字段,最后统一释放。生产代码差不多也是这个套路,只是中间的业务逻辑更复杂。
#include "cJSON.h"
#include <stdio.h>
#include <stdlib.h>
int main() {
char json[] = "{\"name\": \"John\", \"age\": 30, \"isMan\": true, \"height\": 180.99}";
cJSON *root = cJSON_Parse(json);
if (root == NULL) {
printf("Error parsing JSON\n");
return -1;
}
cJSON *name = cJSON_GetObjectItem(root, "name");
if (name) {
printf("Name: %s\n", name->valuestring);
}
cJSON *age = cJSON_GetObjectItem(root, "age");
if (age) {
printf("Age: %d\n", age->valueint);
}
cJSON *isMan = cJSON_GetObjectItem(root, "isMan");
if (isMan) {
printf("Is Man: %d\n", isMan->valueint);
}
cJSON *height = cJSON_GetObjectItem(root, "height");
if (height) {
printf("Height: %lf\n", height->valuedouble);
}
// 整棵树在这里统一释放
cJSON_Delete(root);
return 0;
}
代码里的取值逻辑本身不是重点,关键是最后那行cJSON_Delete(root)。只要保证程序在所有退出路径上都能走到它(或者在提前退出时同样执行了释放),内存就不会出问题。
总的来说,cJSON_Delete的机制不复杂,但因为太简单,反而容易因为疏忽引出bug。搞明白三个点基本就够用了:解析成功才删;只删一次根节点;别漏掉任何一条代码路径。
养成习惯,写完解析逻辑顺手把释放补上,后面能省掉很多熬夜查内存的麻烦。
上一篇: Java Stream 排序与 Comparator 的空指针处理,以及 IDEA 调试里 null 不显示的坑
搞懂cJSON里内存释放的正确姿势,避开野指针和内存泄漏的常见坑。
聊一聊 strncmp 的比较逻辑、容易踩的坑,以及几种空字符串初始化方式的区别和选用场景
cJSON库在处理JSON数据时涉及大量动态内存分配。本文将深入剖析cJSON_Delete函数的工作原理,指导开发者如何检查cJSON_Parse返回值、避免重复释放,以及通过规范操作彻底杜绝内存泄漏,确保程序高性能与稳定性。
本文聚焦Go语言哈希表核心,详细剖析了Bucket地址计算的内部逻辑。通过深入理解掩码运算、地址偏移与指针转换,揭示了Go语言实现高效数据定位的奥秘。掌握这些底层原理,将助您更精准地使用`map`类型并进行性能调优,同时强调关注官方更新以保持兼容性。
还在为C语言字符串比较和初始化头疼?本文揭秘`strncmp`函数的实战技巧,教你如何精准比较字符串前N个字符。同时,提供多种字符串空值初始化的实用方案,助你避免常见陷阱,写出更安全、更高效的C代码。即学即用,告别Bug!