gpt4 book ai didi

c - json_decref() 导致内存无效写入

转载 作者:行者123 更新时间:2023-11-30 16:43:16 24 4
gpt4 key购买 nike

调用 json_decref() 时遇到一些问题

#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);

}

我使用 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_decref()作为借用引用返回的值,除非您手动调用 json_incref() 来增加引用计数。在您的简约示例中,这不是必需的,因此删除 json_decref (bb); 并且代码应该按预期工作。

但是,如果在释放aa后需要使用bb,则在bb之后调用json_incref (bb); = json_array_get(aa, 0); 之后,当您使用完 bb 后,您可以调用 json_decref (bb);

此外,尽管 json_array_get() 不介意传递 NULL 值,但在使用之前检查 aa 的值会很好,所以读者您的代码不必仔细检查手册,看看在 json_array_get() 中使用它之前不检查 aa 是否可以。

关于c - json_decref() 导致内存无效写入,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45410841/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com