1 CJSON介绍

  • CJSON 库下载网址:https://sourceforge.net/projects/cjson/官方地址

  • 工作中 CJSON 常用于处理 JSON 数据的序列化(生成 JSON 字符串)和反序列化(解析 JSON 字符串)。

  • CJSON 库使用动态内存分配(如 malloc/free)管理 JSON 对象,因此必须手动释放 CJSON 库分配的内存。

  • CJSON 库提供了两个释放内存的函数:

cJSON_Delete(cJSON *item);
cJSON_free(void *object)

cJSON_Delete 是用来释放json对象的,cJSON_free是用来释放其他对象的,两者不能混用。
cJSON_Delete 接口会递归释放一个 json 体内的所有对象,而 cJSON_free 只会进行一次释放。

2 使用场景

当使用下面这些创建 JSON 对象时,需要用cJSON_Delete()释放,(当然,释放父 JSON 对象后,子 JSON 对象也会被释放)。

cJSON *cJSON_CreateNull(void);
cJSON *cJSON_CreateTrue(void);
cJSON *cJSON_CreateFalse(void);
cJSON *cJSON_CreateBool(int b);
cJSON *cJSON_CreateNumber(double num);
cJSON *cJSON_CreateString(const char *string);
cJSON *cJSON_CreateArray(void);
cJSON *cJSON_CreateObject(void);

示例如下:

cJSON *ptr = cJSON_CreateObject();
cJSON_Delete(ptr);

释放 CJSON 库分配的字符串,必须对每个通过 cJSON_Print() 返回的字符串调用一次,示例如下:

// cJSON_Print() 处理同 cJSON_PrintUnformatted
char* str = cJSON_PrintUnformatted(cJSON);
cJSON_free(str);

3 函数对比

函数作用对象释放逻辑
cJSON_DeletecJSON* 对象(结构体指针)递归释放整个 JSON 对象树(包括所有子节点和动态分配的成员),
调用 free() 释放结构体本身。
cJSON_free字符串指针(char*直接调用系统 free() 释放内存,通常用于释放 cJSON_Print() 返回的字符串。

4 总结

接口功能输出释放方法
cJSON_CreateObject生成一个空白的 json 对象一个 json 对象cJSON_Delete
cJSON_Parse将 json 字符串解析成 json 对象一个 json 对象cJSON_Delete
cJSON_ParseWithLength将固定长度 json 字符串解析成 json 对象一个 json 对象cJSON_Delete
cJSON_Duplicate复制一个 json 对象一个 json 对象cJSON_Delete
cJSON_Print将 json 对象解析成格式化的 json 字符串一个 json 字符串cJSON_free
cJSON_PrintUnformatted将 json 对象解析成无格式化的 json 字符串一个 json 字符串cJSON_free
cJSON_PrintPreallocated将 json 对象解析成 json 字符串一个 json 字符串cJSON_free

本文是「C/C++ 代码安全审计」系列的第 1 篇,点击专栏导航查看全部系列内容。

Logo

腾讯云面向开发者汇聚海量精品云计算使用和开发经验,营造开放的云计算技术生态圈。

更多推荐