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_Delete cJSON* 对象(结构体指针) 递归释放整个 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

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

更多推荐