json_decref()导致内存写入无效
我在调用json_decref()时遇到了一些问题 如果我注释掉json_decref()导致内存写入无效,c,json,C,Json,我在调用json_decref()时遇到了一些问题 如果我注释掉json\u decref(aa),它将导致内存泄漏,如何解释它,我应该怎么做 返回借用的引用。除非手动调用json\u incremf()以增加引用计数,否则不能调用作为借用引用返回的值。在您的简约示例中,这不是必需的,因此删除json_decref(bb)并且代码应按预期工作 但是,如果在发布aa后需要使用bb,则调用json\u incref(bb)afterbb=json\u array\u get(aa,0)和更高版本,当
json\u decref(aa)代码>,它将导致内存泄漏,如何解释它,我应该怎么做 返回借用的引用。除非手动调用json\u incremf()
以增加引用计数,否则不能调用作为借用引用返回的值。在您的简约示例中,这不是必需的,因此删除json_decref(bb)代码>并且代码应按预期工作
但是,如果在发布aa
后需要使用bb
,则调用json\u incref(bb)
afterbb=json\u array\u get(aa,0)
和更高版本,当您使用bb
时,可以调用json\u decref(bb)代码>
此外,即使json\u array\u get()
不介意被传递一个空值,在使用它之前检查aa
的值也很好,因此代码的读者不必在手册中仔细检查,看看在json\u array\u get()中使用它之前不检查aa
是否可以
#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)