詹森 json_decref 意外行为
jansson json_decref unexpected behavior
我正在为 C 项目使用 jansson 库。
我在理解如何使用 decref 时遇到一些问题。是否应该在每个新的 json_t 参数之后使用它?据我所知,jansson 会借用参考资料来简化这件事。
如果我 运行 这个程序并检查 a_id 和 a_test 的值,它们是相同的。我预计 a_test 会出现错误或空值。
我尝试了同样的想法,但后来我为 json_acc 和 json_param 添加了 decref,但它在我读取 1:th 值之前就崩溃了。我以为会崩溃,但直到 a_test.
这是一个更大项目的一部分,但我尝试添加一个示例来展示要点。
API 边:
json_t* parObj;
void loadFile(char* path)
{
json_error_t error;
parObj = json_load_file(path, 0, &error);
}
int getAccountId(char* id)
{
json_t* json_acc = json_object_get(parObj, "accounts");
json_t* json_param = json_object_get(json_acc, id);
return json_integer_value(json_param);
}
void cleanJson()
{
json_decref(parObj);
}
来电方:
loadFile("/home/jacob/accountDump.json");
int a_id = getAccountId("10");
cleanJson();
int a_test = getAccountId("10");
我确实误解了它应该如何工作,我假设 decref 也会将内存设置为零。
API 将删除引用并使其成为空闲内存,但只要没有人在那里写入或将其 memset 为零并且指针未设置为空,我仍然可以从中读取值指针。
我正在为 C 项目使用 jansson 库。
我在理解如何使用 decref 时遇到一些问题。是否应该在每个新的 json_t 参数之后使用它?据我所知,jansson 会借用参考资料来简化这件事。
如果我 运行 这个程序并检查 a_id 和 a_test 的值,它们是相同的。我预计 a_test 会出现错误或空值。
我尝试了同样的想法,但后来我为 json_acc 和 json_param 添加了 decref,但它在我读取 1:th 值之前就崩溃了。我以为会崩溃,但直到 a_test.
这是一个更大项目的一部分,但我尝试添加一个示例来展示要点。
API 边:
json_t* parObj;
void loadFile(char* path)
{
json_error_t error;
parObj = json_load_file(path, 0, &error);
}
int getAccountId(char* id)
{
json_t* json_acc = json_object_get(parObj, "accounts");
json_t* json_param = json_object_get(json_acc, id);
return json_integer_value(json_param);
}
void cleanJson()
{
json_decref(parObj);
}
来电方:
loadFile("/home/jacob/accountDump.json");
int a_id = getAccountId("10");
cleanJson();
int a_test = getAccountId("10");
我确实误解了它应该如何工作,我假设 decref 也会将内存设置为零。
API 将删除引用并使其成为空闲内存,但只要没有人在那里写入或将其 memset 为零并且指针未设置为空,我仍然可以从中读取值指针。