我正在使用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
没有经验。
谢谢你的帮助!
答案 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
时,root
会json_object_put
value
并失败,因为value
已不存在。
如果您不希望value
比root
更长,只需删除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)时,它还尝试释放了内存以获取值,并且由于已经释放了内存,因此导致了分段错误。