释放内存两次

释放内存两次是未定义的行为,例如

int * x = malloc(sizeof(int));
*x = 9;
free(x);
free(x);

从标准引用(7.20.3.2.C99 的自由功能):

否则,如果参数与之前由 calloc,malloc 或 realloc 函数返回的指针不匹配,或者如果通过调用 free 或 realloc 释放了空间,则行为未定义。