0
我有一個GList
其中包含GSList
的集合。此GSlist包含一個GString
的集合。當我釋放整個GList
時,出現分段錯誤。無效()/刪除/刪除[]/realloc()與g_string_free()
現在檢查下面的代碼。
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
'd使用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
}
有人能告訴我爲什麼我得到這個錯誤嗎?由於內存分配和重新分配的順序都一樣,我不知道爲什麼會發生這種情況。
我想我們需要看到更多的代碼,至少是一些'mysql_storage_load_accounts()'。它是否有一些錯誤條件? – 2012-07-18 16:25:02
@MichałGórny我已經更新了這個問題。查看最後一個鏈接 – 2012-07-18 16:35:27
除非我遺漏了一些東西,否則你似乎在'mysql_storage_load_accounts()'中釋放'password'。我沒有看到任何特殊的處理,所以我的第一個猜測是它會被釋放兩次。 – 2012-07-18 16:53:39