0

我使用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。谢谢你的帮助!

4

4 回答 4

0

感谢你的回复!

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

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

谢谢您的帮助。

于 2015-11-01T08:02:13.753 回答
0

如果我是你,我会在开始使用之前阅读一个库的文档。

如此处所述 json_object_object_add(root, "Child", value)将所有权转移valueroot。这意味着您不再json_object_put对它负责。当你json_object_put的时候,rootjson_object_put就是value你的。

当你json_object_putvalue它的引用计数器下降到 0 并且它的内存被释放。当您json_object_put使用时root,它会尝试json_object_putvalue失败,因为value不再存在。

如果您不希望value超过root,只需删除该json_object_put(value)行。

如果要valueroot被释放后使用,请使用:

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

于 2015-10-31T11:45:39.103 回答
0

问题出json_typeroot. 您的程序创建了 的两个实例json_type_string,您尝试将键/值对添加到名为 的实例中root。json-c 库应该可能检测到不正确json_typeroot并忽略添加请求或其他内容,而是在调用时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;
}

它工作并返回输出

to string ={ "Child": "My Child Object" }

如果您编写一个将 a 作为参数的函数,则可以使用诸如json_object_get_type()确定json_typea之类的函数。json_object

于 2022-03-02T01:51:21.977 回答
0

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

于 2018-08-07T22:36:44.107 回答