簡體   English   中英

json_object_object_add,分段錯誤

[英]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)傳送的所有權valueroot 這意味着您不再對json_object_put負責。 當您json_object_put rootjson_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) 時,它也嘗試釋放內存值,因為它已經被釋放,你導致了分段錯誤。

問題出在rootjson_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_typejson_object

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM