如何释放json_object?

时间:2013-02-14 16:54:11

标签: c json libjson

我有以下代码

#include <stdio.h>
#include <stdlib.h>
#include <stddef.h>
#include <string.h>

#include <json/json.h>

int main(int argc, char **argv)
{
      json_object *new_obj;
      char buf[] = "{ \"foo\": \"bar\", \"foo2\": \"bar2\", \"foo3\": \"bar3\" }"
      new_obj = json_tokener_parse(buf);
      .....
      json_object_put(new_obj);
}

json_object_put(new_obj)是否释放了与new_obj相关的所有内存?

2 个答案:

答案 0 :(得分:5)

来自文档:

void json_object_put    (struct json_object *this)  
  

减少json_object的引用计数,如果它达到零则释放

来源: http://oss.metaparadigm.com/json-c/doc/html/json__object_8h.html

答案 1 :(得分:-2)

您必须了解库的工作原理。

json_tokener_parse()首先,它创建一个对象,该对象将充当内存管理父对象,从该对象创建的所有对象都将用来访问它们定义的数据。

因此,如果您一路为字符串字段制作char * str,那么该字段实际上并不存储字符串,从json_tokener_parse()返回的原始对象就可以存储该字符串。

这就是为什么您不能只使用普通的free()并期望事情像字符数组一样工作的原因。

为了安全起见,请勿使用json_tokener_parse_ex()函数,因为您还必须释放作为令牌生成器的对象,而使用json_tokener_parse()则不需要该参数。

除此之外,要安全关闭所有内容,只需执行以下操作:

while (json_object_put(orig_object) != 1) {
  // keep freeing
}

您只需要这样做一次,但是库可能会更改。