我有以下代码
#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
相关的所有内存?
答案 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
}
您只需要这样做一次,但是库可能会更改。