json_decref()导致内存写入无效

时间:2017-07-31 08:29:05

标签: c json

当我调用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) ,它会导致内存泄漏,如何解释它以及我该怎么办?

1 个答案:

答案 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