json_object_add()后的json_object对象怎么没有随父对象的释放而释放

C语言 码拜 8年前 (2017-05-01) 2119次浏览
下面是代码

#include <stdio.h>
#include <stdlib.h>
#include <json-c/json.h>
#include <string.h>
 
 
 
//该函数用于接收一个json格式的字符串,转换成json_object格式
//参数为字符串、字符串长度、要返回的json_object对象
//成功返回0,失败返回-1
//注意josn假如获取成功将在函数内部开辟存储空间,不要忘记在函数外面释放空间
 
int string_to_json(char *string, unsigned long len, json_object **json)
{
    json_tokener *tok = json_tokener_new();//创建一个json_tokener对象,以便进行转换,记得要释放
    enum json_tokener_error jerr;
    do
    {
        *json = json_tokener_parse_ex(tok, string, len);
    }while((jerr = json_tokener_get_error(tok)) == json_tokener_continue);
    if(jerr != json_tokener_success  || tok->char_offset < (int)len)
    {
        json_tokener_free(tok);
        return -1;
    }
    if(json_object_get_type(*json) == json_type_object)
    {
        json_tokener_free(tok);
        return 0;
    }
    json_tokener_free(tok);
    return -1;
}
 
int main()
{
    char json[65535] = {0};
    FILE * json_file;
    json_file = fopen("/home/han/桌面/tempro/json/json.txt","r");
    if(json_file == NULL)
    {
        printf("shibai \n");
        return -1;
    }
    fread(json, 65535, 1, json_file);
    //printf("%s",json);
    json_object *new_json = NULL;
    unsigned long  len = strlen(json);
    json_object *new_field = NULL; 
    if(string_to_json(json, len, &new_json) == 0)
    {   
        const char *str = json_object_get_string(new_json);
        printf("转换成功的json为:\n%s\n",str);
        new_field = json_object_new_string("周杰伦");
        json_object_object_add(new_json, "最爱的歌手", new_field);
        printf("\n\n添加后的json为:\n%s\n",str);
    }
    if(json_object_get_type(new_json) != json_type_null)
    {
        printf("释放空间\n");
        json_object_put(new_json);
    }
    const char *after_put = json_object_get_string(new_field);
    printf("竟然还存在:%s\n",after_put);
    return 0;
}

问一下new_field被添加到了new_json中,但是为什么没有随new_json的释放而释放呢?在代码的最后,new_field还可以使用呀?
求高手们解释

解决方案

40

其实电脑开机后物理内存的每个字节都是可读写的,从来不会原因是所谓的new、delete或malloc、free而被创建、销毁。区别仅在于操作系统内存管理模块在你读写时能否能发现并能否采取相应动作而已。操作系统管理内存的粒度不是字节而是页,一页通常为4KB。

CodeBye 版权所有丨如未注明 , 均为原创丨本网站采用BY-NC-SA协议进行授权 , 转载请注明json_object_add()后的json_object对象怎么没有随父对象的释放而释放
喜欢 (0)
[1034331897@qq.com]
分享 (0)