C : jansson json_decref - 分段错误
C : jansson json_decref - segmentation fault
我有一个 for 循环,在迭代循环时,如果索引是偶数索引,则必须释放 json 对象,并且必须再次构造一个新对象,并且必须再次重复该过程.
同样,使用下面的脚本,
#include <stdio.h>
#include <string.h>
#include <jansson.h>
int main(void) {
char* s = NULL;
json_t *root = json_object();
int myNum[10] = {10, 20, 10, 40, 10, 60, 10, 80, 10, 100};
for(int i=0; i<10;i++)
{
if(i%2==0)
{
json_t *root = json_object();
}
char *key = (char*)malloc(2);
snprintf(key, sizeof(key), "%d", myNum[i]);
json_object_set_new( root, key, json_integer(i));
s = json_dumps(root, 0);
puts(s);
if(i%2==0){
json_decref(root);
//free(s);
}
}
}
如何使用jansson json对象构造并在索引为偶数索引时清除其内存来实现以下结果?
{"10":0,"20":1}
{"10":2,"40":3}
{"10":4,"60":5}
{"10":6,"80":7}
{"10":8,"100":9}
而现在,上面的脚本给出了以下响应,
{"10": 0}
Segmentation fault (core dumped)
您有一些记忆问题:
int main(void) {
char* s = NULL;
json_t *root = json_object();
您在循环的第一次迭代中立即请求一个新的 JSON 对象。从此函数调用创建的对象不再可访问。这是内存泄漏。
int myNum[10] = {10, 20, 10, 40, 10, 60, 10, 80, 10, 100};
for(int i=0; i<10;i++)
{
if(i%2==0)
{
json_t *root = json_object();
}
char *key = (char*)malloc(2);
snprintf(key, sizeof(key), "%d", myNum[i]);
这会将 3 个字节写入只能容纳 2 个字节的内存。
json_object_set_new( root, key, json_integer(i));
s = json_dumps(root, 0);
puts(s);
if(i%2==0){
json_decref(root);
此调用后您不能再使用 root
。引用的对象很可能在引用计数器递减后被释放。
如果您尝试在下一次迭代中添加新对象,则您没有有效的对象。
这可能会触发您的分段错误。
//free(s);
}
}
}
正在阅读您的描述
if the index is even index the json object has to be freed and again a new object has to be constructed
确实如此,但你不这样做。
要解决您的问题,
- 仅在奇数迭代结束时免费
- 在
json_decref
之后立即请求一个新对象。无需等待第二次下一次迭代的开始。
我有一个 for 循环,在迭代循环时,如果索引是偶数索引,则必须释放 json 对象,并且必须再次构造一个新对象,并且必须再次重复该过程.
同样,使用下面的脚本,
#include <stdio.h>
#include <string.h>
#include <jansson.h>
int main(void) {
char* s = NULL;
json_t *root = json_object();
int myNum[10] = {10, 20, 10, 40, 10, 60, 10, 80, 10, 100};
for(int i=0; i<10;i++)
{
if(i%2==0)
{
json_t *root = json_object();
}
char *key = (char*)malloc(2);
snprintf(key, sizeof(key), "%d", myNum[i]);
json_object_set_new( root, key, json_integer(i));
s = json_dumps(root, 0);
puts(s);
if(i%2==0){
json_decref(root);
//free(s);
}
}
}
如何使用jansson json对象构造并在索引为偶数索引时清除其内存来实现以下结果?
{"10":0,"20":1}
{"10":2,"40":3}
{"10":4,"60":5}
{"10":6,"80":7}
{"10":8,"100":9}
而现在,上面的脚本给出了以下响应,
{"10": 0}
Segmentation fault (core dumped)
您有一些记忆问题:
int main(void) {
char* s = NULL;
json_t *root = json_object();
您在循环的第一次迭代中立即请求一个新的 JSON 对象。从此函数调用创建的对象不再可访问。这是内存泄漏。
int myNum[10] = {10, 20, 10, 40, 10, 60, 10, 80, 10, 100};
for(int i=0; i<10;i++)
{
if(i%2==0)
{
json_t *root = json_object();
}
char *key = (char*)malloc(2);
snprintf(key, sizeof(key), "%d", myNum[i]);
这会将 3 个字节写入只能容纳 2 个字节的内存。
json_object_set_new( root, key, json_integer(i));
s = json_dumps(root, 0);
puts(s);
if(i%2==0){
json_decref(root);
此调用后您不能再使用 root
。引用的对象很可能在引用计数器递减后被释放。
如果您尝试在下一次迭代中添加新对象,则您没有有效的对象。
这可能会触发您的分段错误。
//free(s);
}
}
}
正在阅读您的描述
if the index is even index the json object has to be freed and again a new object has to be constructed
确实如此,但你不这样做。
要解决您的问题,
- 仅在奇数迭代结束时免费
- 在
json_decref
之后立即请求一个新对象。无需等待第二次下一次迭代的开始。