Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/arduino/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
json_decref()导致内存写入无效_C_Json - Fatal编程技术网

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_decref()时遇到了一些问题

如果我注释掉
json\u decref(aa),它将导致内存泄漏,如何解释它,我应该怎么做

返回借用的引用。除非手动调用
json\u incremf()
以增加引用计数,否则不能调用作为借用引用返回的值。在您的简约示例中,这不是必需的,因此删除
json_decref(bb)并且代码应按预期工作

但是,如果在发布
aa
后需要使用
bb
,则调用
json\u incref(bb)
after
bb=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)