[英]json_object_object_add, segmentation fault
我正在如下使用libjosn-c
並遇到分段錯誤。
如果我刪除行json_object_object_add(root, "Child", value);
,不會出現錯誤。
int main(int argc, char **argv)
{
json_object *root = NULL, *value = NULL;
root = json_object_new_string("My Object");
value = json_object_new_string("My Child Object");
json_object_object_add(root, "Child", value);
printf("to string =%s\n", json_object_to_json_string(root));
json_object_put(value);
json_object_put(root);
return 0;
}
我對libjson-c
沒有經驗。 謝謝你的幫助!
如果我是你,我會在開始使用一個庫之前閱讀它的 文檔。
如所描述的在這里json_object_object_add(root, "Child", value)
傳送的所有權value
到root
。 這意味着您不再對json_object_put
負責。 當您json_object_put
root
它json_object_put
是您的value
。
當您json_object_put
value
,它的引用計數器下降到 0 並且它的內存被釋放。 當您json_object_put
root
,它嘗試json_object_put
value
並失敗,因為該value
不再存在。
如果您不希望該value
超過root
,只需刪除json_object_put(value)
行。
如果您想在root
被釋放后使用value
,請使用:
json_object_object_add(root, "Child", json_object_get(value))
感謝你的回復!
據我了解您的解釋,只需刪除行json_object_put(value);
但是,我不明白為什么行json_object_object_add(root, "Child", value);
導致錯誤。
感謝您的幫助。
因為 json_object_put(root) 也釋放了它擁有的所有對象。 由於您在執行 put(root) 時向“root”添加了“value”,因此它也執行了 put(value)。 通過讓你的 json_object_put(value) 釋放內存值,當你執行 json_object_put(root) 時,它也嘗試釋放內存值,因為它已經被釋放,你導致了分段錯誤。
問題出在root
的json_type
中。 您的程序創建了兩個json_type_string
實例,您嘗試將鍵/值對添加到名為root
的實例。 json-c 庫可能檢測到root
的不正確json_type
並忽略了添加請求或其他內容,而是在調用json_object_object_add(root, "Child", value);
(崩潰至少可以在 json-c 的 v0.11 中復制)。
相反,如果您將程序編寫為:
int main(int argc, char **argv)
{
json_object *root = NULL, *value = NULL;
root = json_object_new_object(); /* json_type_object */
value = json_object_new_string("My Child Object"); /* json_type_string */
json_object_object_add(root, "Child", value);
printf("to string =%s\n", json_object_to_json_string(root));
json_object_put(root);
return 0;
}
它有效並返回 output
to string ={ "Child": "My Child Object" }
如果您編寫一個以 one 作為參數的 function,則可以使用json_object_get_type()
之類的函數來確定json_type
的json_object
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.