当我调用json_decref()
时遇到了一些问题read_csv
我使用vargrind运行程序,它说大小为8的无效写入
#include <jansson.h>
#include <stdio.h>
void main()
{
json_t *aa, *bb, *cc, *dd;
aa = json_load_file ("/home/cuihaikuo/demo.json", JSON_STRICT, NULL);
bb = json_array_get (aa, 0);
if (bb != NULL)
json_decref (bb);
if (aa != NULL)
json_decref (aa);
}
如果我评论==2641== Invalid write of size 8
==2641== at 0x4E4201A: json_delete (in /usr/lib/x86_64-linux-gnu/libjansson.so.4.7.0)
==2641== by 0x4006C3: json_decref (in /home/cuihaikuo/chk/test/a)
==2641== by 0x400721: main (in /home/cuihaikuo/chk/test/a)
==2641== Address 0x5412438 is 8 bytes inside a block of size 48 free'd
==2641== at 0x4C2EDEB: free (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so)
==2641== by 0x4006C3: json_decref (in /home/cuihaikuo/chk/test/a)
==2641== by 0x40070E: main (in /home/cuihaikuo/chk/test/a)
,它会导致内存泄漏,如何解释它以及我该怎么办?
答案 0 :(得分:0)
json_array_get()返回借用的引用。除非您手动调用json_incref()
以增加引用计数,否则不得对作为借用引用返回的值调用json_decref()。在您的简约示例中,这不是必需的,因此请删除json_decref (bb);
,代码应按预期工作。
但是,如果您在发布bb
后需要使用aa
,请在json_incref (bb);
之后及之后使用{{1}完成后致电bb = json_array_get (aa, 0);
},您可以致电bb
此外,尽管json_decref (bb);
并不介意传递NULL值,但在使用它之前检查json_array_get()
的值会很好,因此您的代码的读者不会#39} ; t必须仔细检查手册,看看在aa
中使用它之前是否可以检查aa
。