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_object_add(root, "Child", value)に、 の所有権を に譲渡valuerootます。それはあなたがそれに対して責任を負わないことを意味しますjson_object_put。あなたがそれをするときjson_object_put、それはあなたのためです。rootjson_object_putvalue

を実行json_object_putするvalueと、参照カウンターが 0 になり、メモリが解放されます。を実行しようとjson_object_putすると、が存在しないために失敗します。rootjson_object_putvaluevalue

valueを より長生きさせたくない場合はroot、その行を削除してjson_object_put(value)ください。

解放されvalueた後に使用する場合は、次を使用します。root

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

于 2015-10-31T11:45:39.103 に答える
0

json_object_put(root) は、それが所有するすべてのオブジェクトも解放するためです。put(root) を実行したときに「root」に「value」を追加したため、put(value) も実行されました。json_object_put(value) を使用することで、値のメモリを解放し、json_object_put(root) を実行すると、値のメモリも解放しようとしましたが、既に解放されているため、セグメンテーション違反が発生しました。

于 2018-08-07T22:36:44.107 に答える