我们可以使用 cJSON_Parse() 函数来解析一个 JSON 格式的字符串;
该函数会在内部,通过 malloc() 来申请内存空间,
所以,使用完之后,需要手动调用 cJSON_Delete() 函数来释放内存空间;
//========================================================================
注意,我们不能够修改 cJSON 对象的 valuestring 指针地址,
否则,当调用 cJSON_Delete() 函数来释放内存块的时候,就会释放 valuestring 指针指向修改后的内存,操作异常内存块;
韦凯峰 Linux C/C++零基础编程教程
Linux系统编程,Openwrt系统开发
//========================================================================
cJSON* json = NULL;
json = cJSON_Parse(buffer);
cJSON_Delete(json);
//========================================================================
使用 cJSON_CreateObject 函数来创建 JSON 根节点的时候,如果创建成功,最终操作完之后,需要调用 cJSON_Delete() 函数来释放对象;
如下:
// 创建JSON Object
cJSON *root = cJSON_CreateObject();
...
// 释放内存
cJSON_Delete(root);
//========================================================================
当创建了 root 根节点之后,在该结点下挂载的任何子节点,创建之后,不需要释放;
例如:
//=================
//获取管理员配置文件的 JSON 数据;
//=================
cJSON* root = NULL;
cJSON *array = NULL;
root = cJSON_CreateObject();
array = cJSON_CreateArray();
cJSON_AddItemToObject(root,"user_array",array);
cJSON *obj = cJSON_CreateObject();
cJSON_AddItemToArray(array,obj);
cJSON_AddItemToObject(obj,"name",cJSON_CreateString(pu->name));
cJSON_AddItemToObject(obj,"pwd",cJSON_CreateString(pu->pwd));
cJSON_AddItemToObject(obj,"work_dir",cJSON_CreateString(pu->work_dir));
cJSON_AddItemToObject(obj,"power",cJSON_CreateNumber(pu->power));
//=================
//=================
char* p = cJSON_Print(root);
#if 1
LOG("p = %s\n",p);
#endif
file_write_clear(path,p,strlen(p));
free(p);
//=================
//=================
free(pbuf);
cJSON_Delete(root);
return 0;
//========================================================================
在 root 结点下挂载了 array,obj 结点,这些接收也是使用 cJSON_CreateObject() 函数来创建对象;
但是,最终,只需要释放 root 结点对象。
因为,当我们调用:
cJSON_AddItemToObject(root,array);
cJSON_AddItemToArray(array,obj);
就把 array 添加到 root 结点,把 obj 添加到 root 结点;
最终,所有的元素都汇总到 root 结点;
所有,最终,释放 root 结点就可以了,因为,我们操作的 array,obj 对象都已经挂载到 root 结点中了;
//========================================================================
所以,我们可以总结:
1 使用 cJSON_CreateObject() 创建的对象,最终,必须使用 cJSON_Delete() 释放对象;
2 如果使用 cJSON_CreateObject() 创建的对象 obj1 挂载到 obj2,那么,最终只需要释放 obj2 即可;
因为,obj1 挂载到 obj2,当释放 obj2 的时候,已经释放了 obj1,所以,不再需要释放 obj1;
韦凯峰 Linux C/C++零基础编程教程
Linux系统编程,Openwrt系统开发
原文地址:https://blog.csdn.net/feng19870412/article/details/128354493
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。