C语言 无效的 free() / delete / delete[] / realloc() 与 g_string_fr



我有一个包含GSList集合的GList。此 GSlist 包含 GString 的集合。 当我释放整个GList时,我得到了分段错误。

现在检查以下代码。

GList *m_rows = NULL;
m_rows = mysql_multiple_rows(mysql, sql1->str);
g_list_foreach(m_rows, mysql_storage_load_settings, &data);
mysql_free_multiple_rows(m_rows); /// <----------------------- works just fine
m_rows = mysql_multiple_rows(mysql, sql2->str);
if(g_list_length(m_rows)>0){
    g_list_foreach(m_rows, mysql_storage_load_accounts, &data);
    mysql_free_multiple_rows(m_rows); /// <----------------------- Segmentation fault!
}else{
    fprintf(stderr, "e[31mtUser has no account!e[0m");
}

所以m_rows只使用 g_string_new()g_slist_prepend()g_list_prepend() 进行分配。 g_string_new()创建新GString并添加到GSList 中。然后,所有生成的GSList都添加到GList。它发生在mysql_multiple_rows函数中。

他们free使用mysql_free_multiple_rows。此函数只会执行相反的操作。

请参阅清理功能。

static void mysql_free_multiple_rows(GList *table){
    g_list_free_full(table, mysql_free_single_row);
}
static void mysql_free_single_row(gpointer data){
    g_slist_free_full(data, msyql_free_single_row_field); // data here is GSlist
}
static void msyql_free_single_row_field(gpointer data){
    g_string_free(data, TRUE); // data here is GString actually
}

谁能告诉我为什么我会收到此错误?由于内存分配和取消分配顺序是相同的,我不知道为什么会发生这种情况。

  1. 瓦尔格林德输出
  2. 源文件

查看代码,您似乎正在释放password mysql_storage_load_accounts().但是,我没有看到任何特殊的处理方式,所以我的猜测是它被释放了两次。

最新更新