我有一个GList
,其中包含GSList
的集合。该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[31m\tUser 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
}
谁能告诉我为什么我会收到此错误?由于内存分配和取消分配序列相同,所以我不知道为什么会发生这种情况。
Valgrind output
Source file
最佳答案
查看代码,您似乎正在释放password
中的mysql_storage_load_accounts()
。但是,我看不到对此有任何特殊处理,因此我猜测它会被释放两次。