2012-07-18 74 views
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 
} 

有人能告訴我爲什麼我得到這個錯誤嗎?由於內存分配和重新分配的順序都一樣,我不知道爲什麼會發生這種情況。

  1. Valgrind output
  2. Source file
+2

我想我們需要看到更多的代碼,至少是一些'mysql_storage_load_accounts()'。它是否有一些錯誤條件? – 2012-07-18 16:25:02

+0

@MichałGórny我已經更新了這個問題。查看最後一個鏈接 – 2012-07-18 16:35:27

+0

除非我遺漏了一些東西,否則你似乎在'mysql_storage_load_accounts()'中釋放'password'。我沒有看到任何特殊的處理,所以我的第一個猜測是它會被釋放兩次。 – 2012-07-18 16:53:39

回答

2

看代碼,你似乎在mysql_storage_load_accounts()被釋放password。但是,我沒有看到任何特殊的處理方式,所以我的猜測是它會被釋放兩次。