json_decref()导致内存写入无效
当我调用json_decref()时遇到了一些问题
#include #include 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); }
我使用vargrind运行程序,它说大小为8的无效写入
==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)
如果我注释掉json_decref (aa);
,它会导致内存泄漏,如何解释它,我该怎么办?
json_array_get()返回一个借来的引用。 除非手动调用json_incref()
以增加引用计数,否则不得对作为借用引用返回的值调用json_incref()
。 在您的简约示例中,这不是必需的,因此请删除json_decref (bb);
并且代码应该按预期工作。
但是,如果在释放aa
后需要使用bb
,则调用json_incref (bb);
在bb = json_array_get (aa, 0);
然后,当你使用bb
完成后,你可以调用json_decref (bb);
此外,即使json_array_get()
不介意传递NULL值,在使用之前检查aa
的值会很好,因此您的代码的读者不必仔细检查手册以查看它是否是在json_array_get()
使用它之前不要检查aa
。