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
}
このエラーが発生する理由を誰かに教えてもらえますか? メモリの割り当てと割り当て解除のシーケンスは同じなので、なぜそれが起こっているのかわかりません。