gpt4 book ai didi

c - 无效 free()/delete/delete[]/realloc() 与 g_string_free()

转载 作者:行者123 更新时间:2023-11-30 14:24:36 24 4
gpt4 key购买 nike

我有一个 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 函数中。

使用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

最佳答案

查看代码,您似乎正在释放 mysql_storage_load_accounts() 中的password。但是,我没有看到对它有任何特殊处理,所以我的猜测是它被释放了两次。

关于c - 无效 free()/delete/delete[]/realloc() 与 g_string_free(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11545641/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com