C语言json-c库 json字符串清理内存问题

1、**json_object_to_json_string()、json_object_put()**函数

cpp 复制代码
json_object *json = NULL;
const char *json_str;

json_str = json_object_to_json_string(json);
json_object_put(json);//清除内存

查看json_object 结构可知:json_str 字符串的地址指向的是该结构体中printbuf *_pb 指向的地址,而该地址正是存储json对象转换后的字符串内存区域地址

cpp 复制代码
struct json_object
{
  enum json_type o_type;
  json_object_delete_fn *_delete;
  json_object_to_json_string_fn *_to_json_string;
  int _ref_count;
  struct printbuf *_pb;
  union data {
    json_bool c_boolean;
    double c_double;
    int64_t c_int64;
    struct lh_table *c_object;
    struct array_list *c_array;
    struct {
        char *str;
        int len;
    } c_string;
  } o;
};

调用函数json_object_put() 函数清理json 结构体的时候,就json_str 的内存一并清理了,因为不需要自己再专门清理字符串json_str

cpp 复制代码
struct printbuf {
  char *buf;
  int bpos;     //buf中已经使用的数量
  int size;     //buf的size
};

2、cJSON_Print、cJSON_Delete

在开源项目cJSON中,cJSON结构体并没有像上述json_object结构体中的printbuf *_pb,因此需要自己释放字符串的内存地址。字符串格式化函数调用后返回的字串内存,需要专门调用free函数释放掉

cpp 复制代码
/* The cJSON structure: */
typedef struct cJSON {
	struct cJSON *next,*prev;	/* next/prev allow you to walk array/object chains. Alternatively, use GetArraySize/GetArrayItem/GetObjectItem */
	struct cJSON *child;		/* An array or object item will have a child pointer pointing to a chain of the items in the array/object. */

	int type;					/* The type of the item, as above. */

	char *valuestring;			/* The item's string, if type==cJSON_String */
	int valueint;				/* The item's number, if type==cJSON_Number */
	double valuedouble;			/* The item's number, if type==cJSON_Number */

	char *string;				/* The item's name string, if this item is the child of, or is in the list of subitems of an object. */
} cJSON;
cpp 复制代码
cJSON *pJsonRoot = cJSON_CreateObject();
char* strJson = cJSON_Print(pJsonRoot);
if (NULL != pJsonRoot)
{
	cJSON_Delete(pJsonRoot);
}
printf(strJson);
free(strJson);

参考:【C/C++业务】cJSON总结与使用

json-c-0.9库解析

相关推荐
疯狂SQL1 天前
手写高性能在线 JSON 工具|Web Worker 工程化打包 + 语法自动修复 + 多语言代码生成实战
typescript·json·next.js·web worker·前端性能优化·esbuild·源码实战
LDR0066 天前
Type-C 快充全面升级!LDR6601 赋能个人护理便携电机,重塑剃须刀 / 理发器新体验
c语言·开发语言
Luminous.6 天前
C语言--day30
c语言·开发语言
玖玥拾6 天前
C/C++ 数据结构(七)栈、容器适配器
c语言·数据结构·c++··容器适配器
謓泽6 天前
C语言不是语法,是通往机器的地图。
c语言·开发语言
不会C语言的男孩6 天前
Linux 系统编程 · 第 8 章:进程基础
linux·c语言
2601_951643886 天前
C语言长文整理,关键字和数据类型
c语言·数据类型·关键字·嵌入式开发·格式化输出
m0_547486666 天前
《C#语言程序设计与实践》 全套PPT课件
c语言·c#·c语言程序设计
✎ ﹏梦醒͜ღ҉繁华落℘6 天前
编程基础 --高内聚,低耦合
c语言·单片机
QK_006 天前
C语言 static 关键字三大作用
c语言·开发语言