C中的内存泄漏

时间:2015-03-27 20:01:54

标签: c arrays pointers memory-leaks

我正在使用 GTK ,我不确定 malloc()这里的功能。 Valgrind给我一个内存泄漏,我做得不好? 起初我创建指向指向GTK小部件指针的指针,因为我需要三维数组。

GtkWidget*** widgets;

我正在使用malloc:

widgets = malloc((1)*sizeof(GtkWidget**));
    for(i = 0; i<= l-1; i++) // l = 4 in my case
    {
        widgets[i] = malloc((1)*sizeof(GtkWidget*));
        for(j = 0; j<=3; j++) // 4 is number of elements in this dimension
        {
            widgets[i][j] = malloc((1)*sizeof(GtkWidget));
        }
}

最后我这样做了:

widgets[0][0] = gtk_menu_item_new_with_label("MyLabel");
gtk_menu_shell_append(GTK_MENU_SHELL(indicator_menu), widgets[0][0]);

我的数组可以越来越小,所以我使用的是数组的动态分配,我的最大数组索引类似于小部件[3] [3]。 我没有发布整个代码,因为它很长,我发送的只是valgrind抱怨的部分。我做得不好?谢谢。

2 个答案:

答案 0 :(得分:1)

当你的意思是分配一个指针数组时,你只是分配一个指针的大小。

// this will allocate a single character pointer
char ** ptr = malloc(1 * sizeof(char *));

// this will allocate n character pointers
char ** ptr = malloc(n * sizeof(char *));

因此,如果你想要一个维度为NxM的二维数组,你需要分配一个大小为N的数组,然后从0到N-1遍历该数组并分配大小为M的数组。

您现在正在做的是将从malloc返回的指针分配给您不拥有的内存。你真的想要一个指向GtkWidget结构的二维数组吗?

答案 1 :(得分:1)

使用l作为局部变量不是一个好主意。在l和1之间犯错是很容易的,在一些编辑器中它们看起来非常相似。

widgets = malloc((l)*sizeof(GtkWidget**)); //is what you needed 

iso

widgets = malloc((1)*sizeof(GtkWidget**));

此处语法突出显示问题立即出现。 所以另一个建议是确保使用带语法高亮的编辑器