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

青儿哥哥 2017-04-11 06:16:02
下面是代码
#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还可以使用呀???
求大神们解释
...全文
697 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
青儿哥哥 2017-04-12
  • 打赏
  • 举报
回复
引用 3 楼 zhao4zhong1 的回复:
new、delete 对应 借、还 而不对应 创建、销毁。
赵老师,您的意思是,new_field内存可以访问,但是最后的访问不太安全,对吗?
赵4老师 2017-04-12
  • 打赏
  • 举报
回复
new、delete 对应 借、还 而不对应 创建、销毁。
赵4老师 2017-04-12
  • 打赏
  • 举报
回复
其实电脑开机后物理内存的每个字节都是可读写的,从来不会因为所谓的new、delete或malloc、free而被创建、销毁。区别仅在于操作系统内存管理模块在你读写时是否能发现并是否采取相应动作而已。操作系统管理内存的粒度不是字节而是页,一页通常为4KB。
青儿哥哥 2017-04-12
  • 打赏
  • 举报
回复
引用 4 楼 u013910218 的回复:
[quote=引用 3 楼 zhao4zhong1 的回复:] new、delete 对应 借、还 而不对应 创建、销毁。
赵老师,您的意思是,new_field内存可以访问,但是最后的访问不太安全,对吗?[/quote] 谢谢老师,分数稍后就给!
赵4老师 2017-04-12
  • 打赏
  • 举报
回复
你过去租住过的房子合同到期已经退租了,你现在拿着过去的钥匙开门进去,接下来会发生什么呢?
青儿哥哥 2017-04-11
  • 打赏
  • 举报
回复
自己顶一下。大神们来帮忙啊

69,368

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧