0

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()GStringGSListGSListGListmysql_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. Valgrind 出力
  2. ソースファイル
4

1 に答える 1

2

コードを見ると、 で解放passwordされているようですmysql_storage_load_accounts()。ただし、特別な処理は見られないため、2回解放されると思います。

于 2012-07-18T17:17:54.927 に答える