11

我有以下代码

#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

4

2 回答 2

7

从文档中:

void json_object_put    (struct json_object *this)  

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

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

于 2013-02-14T16:56:48.987 回答
-2

您必须了解图书馆的工作原理。

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

因此,如果您一直为字符串字段创建 char *str,则该字段实际上并不存储字符串,而是从返回的原始对象json_tokener_parse()

这就是您不能只使用普通的 free() 并期望事情像 char 数组或其他东西一样工作的原因。

为了安全起见,不要使用该json_tokener_parse_ex()函数,因为您还必须释放作为标记器的对象,而json_tokener_parse()您不需要该参数。

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

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

你应该只需要这样做一次,但库可能会改变。

于 2020-08-06T18:47:00.680 回答