json内存释放注意-第13讲
Posted Linux编程学堂
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了json内存释放注意-第13讲相关的知识,希望对你有一定的参考价值。
我们可以使用 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, "user_array", 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系统开发
以上是关于json内存释放注意-第13讲的主要内容,如果未能解决你的问题,请参考以下文章