json_object_object_add,分段错误

时间:2015-10-31 08:54:04

标签: c++ linux libjson

我正在使用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没有经验。 谢谢你的帮助!

3 个答案:

答案 0 :(得分:1)

如果我是你,我会在开始使用之前阅读图书馆的documentation

如上所述here foreach (DataRow objectrow in ds.Tables["Object"].Rows) { myTableCell = new TableCell(); CheckBox cb = new CheckBox(); //Add unique id to each checkbox... cb.Attributes.Add("id",objectrow["id"].ToString()); myTableCell.Controls.Add(cb); myTableRow.Cells.Add(myTableCell); } json_object_object_add(root, "Child", value)的所有权转移给value。这意味着您不再负责root它。当您json_object_put json_object_put root为您json_object_put时。{/ p>

当你value json_object_put时,它的引用计数器会降为0并释放内存。当您value json_object_put时,rootjson_object_put value并失败,因为value已不存在。

如果您不希望valueroot更长,只需删除json_object_put(value)行。

如果要在value被释放后使用root,请使用:

json_object_object_add(root, "Child", json_object_get(value))

答案 1 :(得分:0)

感谢您的回复!

据我了解您的解释,只需删除第json_object_put(value);

即可

但是,我不明白为什么行json_object_object_add(root, "Child", value);会导致错误。

感谢您的帮助。

答案 2 :(得分:0)

因为json_object_put(root)也会释放它拥有的所有对象。由于在执行put(root)时将“ value”添加到“ root”,因此它也执行了put(value)。通过拥有json_object_put(value),您释放了内存以获取值,并且当您执行json_object_put(root)时,它还尝试释放了内存以获取值,并且由于已经释放了内存,因此导致了分段错误。