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