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讲的主要内容,如果未能解决你的问题,请参考以下文章

json内存释放注意-第13讲

Python内存没有在Linux上释放?

指针操作字符串

避免内存泄漏

第13章:PE文件格式

怎么用new定义一个类数组,并且释放内存