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系统开发

  • 0
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

韦凯峰Linux编程学堂

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值