1

当我运行我的程序时,它调用了一个具有“char *msgtype”的函数并且该函数可能工作但是当另一个函数在其中使用不同的“char *msgtype”时,当程序到达包含它的行时,程序崩溃(并且即使在第二次程序崩溃时调用了第一个函数)。问题是什么 ?

如果我在第二个函数中更改名称,它只会工作一次,再次调用该函数后程序崩溃!

void fun1(){
    ...

    cJSON *root = cJSON_Parse(buffer);
    char *msgtype = cJSON_GetObjectItem(root,"type")->valuestring;

    ...

    free(msgtype);
    cJSON_Delete(root);

    ...
}

void fun2(){
    ...

    cJSON *root = cJSON_Parse(buffer);
    char *msgtype = cJSON_GetObjectItem(root,"type")->valuestring;//it crashes here

    ...

    free(msgtype);
    cJSON_Delete(root);

    ...
}

int main(){
    fun1();
    fun2();//it crashes inside this function !
}
4

1 回答 1

1

你知道cJSON_GetObjectItem()回报是什么吗?它是指向数据结构的指针,还是数据的副本?如果它返回一个指向更大结构的一部分的指针,则不应该释放free()它——当你销毁cjSON对象时它会被释放。

如果你看一下get_object_item()直接从 cJSON_GetObjectItem()in调用的代码cJSON.c,你会看到它返回一个指向cJSON对象中间的指针。你不能调用free()那个返回值。您应该只调用cJSON_Delete()完整的对象。通过调用free(msgtype),您正在破坏root数据结构的完整性——您可能最终也会遇到双重释放问题。

如果它适用于您的平台,请使用Valgrind分析问题所在——它可能会告诉您。如果您的系统malloc()实现有调试钩子(例如 macOS 上的版本),请考虑使用它们。

于 2019-12-17T14:19:14.123 回答