2017-07-31 113 views
0

我有一些問題,當我打電話json_decref()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);,它會導致內存泄漏,如何解釋它,以及我應該怎麼做?

回答

0

json_array_get()返回借來的參考。除非您手動調用json_incref()來增加引用計數,否則不得將json_decref()作爲借用引用返回的值。在你的簡約例子中,這不是必需的,所以刪除json_decref (bb);,代碼應該按預期工作。

但是,如果你需要使用bb您已經發布aa後,然後調用json_incref (bb);bb = json_array_get (aa, 0);後和以後,當您使用bb完成後,你可以調用json_decref (bb);

而且,即使json_array_get()不介意被傳遞一個NULL值,在使用它之前檢查aa的值是很好的,所以你的代碼的讀者不必再次檢查手冊,看看在json_array_get()中使用它之前是否不檢查aa

+0

感謝您的回答,非常明確! – cuihaikuo