为什么我的跨平台C应用程序在Windows中释放内存时崩溃?

为什么我的跨平台C应用程序在Windows中释放内存时崩溃?,c,windows,memory-management,mingw,gtk3,C,Windows,Memory Management,Mingw,Gtk3,我正在用C编写一个跨平台的应用程序。在Linux和macOS上,它运行良好——没有泄漏,没有崩溃,可以毫无问题地加载和编辑大型数据集 在Windows上(使用GTK 3、MinGW和CLion),可以依赖它崩溃——我无法预测它在崩溃之前会加载多少个百字节的数据集,但它会崩溃的越早越好。释放内存时总是发生崩溃。如果我删除空闲代码,那么代码将在调试模式下运行(但不是在非调试模式下)。如果我正在编辑文件,那么崩溃就会发生——只要释放内存,代码就可能崩溃 崩溃的代码示例如下: void tree_cel

我正在用C编写一个跨平台的应用程序。在Linux和macOS上,它运行良好——没有泄漏,没有崩溃,可以毫无问题地加载和编辑大型数据集

在Windows上(使用GTK 3、MinGW和CLion),可以依赖它崩溃——我无法预测它在崩溃之前会加载多少个百字节的数据集,但它会崩溃的越早越好。释放内存时总是发生崩溃。如果我删除空闲代码,那么代码将在调试模式下运行(但不是在非调试模式下)。如果我正在编辑文件,那么崩溃就会发生——只要释放内存,代码就可能崩溃

崩溃的代码示例如下:

void tree_cell_edited (GtkCellRendererText *cell, const gchar *path_string, const gchar *new_text, gpointer data) {
    GtkTreeModel *model = (GtkTreeModel *)data;

    GtkTreePath *path = gtk_tree_path_new_from_string (path_string);
    GtkTreeIter iter;
    gint column = GPOINTER_TO_INT (g_object_get_data (G_OBJECT (cell), "column_number"));
    gtk_tree_model_get_iter (model, &iter, path);

    char *upd_text=(char *)calloc( strlen(new_text) * 2, sizeof(char) );
    strcpy(upd_text, new_text);

    gtk_tree_store_set(GTK_TREE_STORE (model), &iter, column, upd_text, -1);

    free(upd_text);
    gtk_tree_path_free (path);
}
如果我注释掉
免费(upd_文本)这样它就不会崩溃-但它只在调试模式下不会崩溃,这不是解决问题的正确方法

这个代码有什么问题吗?为什么释放内存会导致崩溃?它在其他任何地方都没有被释放过(除非Windows有一些垃圾收集的魔咒,即使是C。)


已解决由于某种原因,问题归结为分配的内存不足。奇怪的是,它没有在MacOS或Linux上引起问题。

这可能是由于代码中的某些错误导致的未定义行为。而在Linux和macOS上,你可以不受任何影响。在
calloc(strlen(new_text)*2,sizeof(char))应该是
(strlen(新文本)+1)*2
?不给nul终结者留出空间是一个常见的错误。我知道你乘以2,但这是因为其他原因吗?不,问题不在于免费的,这是个麻烦。您使用指针
upd_text
执行某些操作,导致
free
崩溃。但是你怎么处理指针呢?你在哪里做的?也许您的验证器函数将它指向其他地方,指向未分配给
malloc
(等)的某个内存?每当程序在
free()
上崩溃时,就意味着堆已被程序中其他地方的错误损坏,例如指针损坏,数组越界访问等不一定与传递给
free()
的变量相关。这就是为什么我们必须始终调用
free()
,以尽早暴露潜在的bug,然后在以后的完整生产过程中它们会再次攻击我们。现在,当您删除对验证器函数的调用时,调用
free
时它还会崩溃吗?