C - free 导致内存损坏



Friends,我正在尝试从指针数组中释放内存,如下所示:

const gchar *strings[21];
strings[0]  = malloc(strAuth)
strings[0]  = strAuth
....
....
    int j=0;
    while(j < 20){
      if (strlen(strings[j]) != 0) {
    g_free((char*)strings[j]);
    g_print("Cleaned:%dn",j);
      }
      j++;
      g_print("%d",j);
    }
//g_free((char*)strings);

j 打印多达 20 个,然后给出

$ ./mkbib 
Cleaned:0
1Cleaned:1
2Cleaned:2
34Cleaned:4
56789101112Cleaned:12
1314151617181920*** glibc detected *** ./mkbib: malloc(): memory corruption (fast): 0x0000000000a14e10 ***

任何解释(对C新手(?

编辑 1 很抱歉提供愚蠢的信息,我正在避免 strAuth 是什么,因为这涉及 gtk 库(我在 clc 中询问特定的库依赖问题方面有不好的经验(。所以真正的代码看起来:

 strings[0]  = g_malloc(strlen(gtk_entry_get_text(GTK_ENTRY(e->entry1))));
 strings[0]  = gtk_entry_get_text(GTK_ENTRY(e->entry1));

其中gtk_entry_get_text属于类型 const gchar *可能我在最初的帖子上浪费了你的时间。 请帮忙。

编辑 2

const gchar *strings[21]; 
strings[0] = g_malloc(strlen(gtk_entry_get_text(GTK_ENTRY(e->entry1)))); 
strings[0] =g_strdup(gtk_entry_get_text(GTK_ENTRY(e->entry1))); 
........
int i=2; 
    while (i < 21) {
      if (strlen(strings[i]) != 0) {
    g_string_append_printf(tstring, ",nt%s="%s"",
        keyword[i], strings[i]);
      g_free((char*)strings[i]);
      strings[i]=NULL;
      g_print("Cleaned:%dn",i);
      } 
      i++;
 }

首先,这个

strings[0]  = malloc(strAuth)
strings[0]  = strAuth;

肯定坏了。strAuth的类型是什么?您是如何设法将strAuth用作malloc(即大小(的参数,然后立即用作分配的右侧大小的? malloc s 参数必须是整数,而 strings[0] 参数具有指针类型。除了完全自相矛盾之外,这种用法还会触发来自编译器的诊断消息。你刚刚忽略了这些消息吗?

如果strAuth是一个字符串,并且如果您尝试为strAuth的副本分配内存,那么典型的内存分配习惯用法将是

strings[0] = malloc(strlen(strAuth) + 1);

其次,为什么你甚至试图在malloc之后为strings[0]分配任何东西?strings[0]中的指针是你与新分配的内存的唯一连接,你应该珍惜和保存它。相反,您可以通过为strings[0]分配一个新值来立即破坏该指针,将您刚刚分配的内存转换为内存泄漏。

同样,如果您尝试在 strings[0] 中创建 strAuth 的副本,那么典型的习语是

strings[0] = malloc(strlen(strAuth) + 1);
strcpy(strings[0], strAuth);

(当然,在实际代码中,应该始终记住检查malloc是否成功(。

在许多平台上,可以使用非标准strdup功能,它恰好包装了上述分配和复制功能,这意味着上述两行可以用简单的

strings[0] = strdup(strAuth);

最后,第三,什么是g_free?您确定它适用于按标准malloc分配的内存(而不是g_malloc(。即使它恰好适用,混合这样的 API 仍然不是一个好主意。如果要按标准malloc(或strdup(分配内存,那么最好坚持使用标准free来释放内存。

strings[0]  = malloc(strAuth)
strings[0]  = strAuth

strings[0] 分配内存后,您用 strAuth 覆盖返回的指针,我不知道它是什么,但可能是一个未使用 malloc()(或其亲戚之一,如 realloc()(分配的字符串。而且你不能释放这样的对象。

(无论如何:如果strAuth是一个字符串,你不应该为它的长度分配足够的空间(加上一个用于终止 NUL 字节(吗? malloc(strAuth)对我来说似乎很荒谬。

让我们添加一些注释来帮助您:

const gchar *strings[21];     // allocate an array of 21 pointers to gchar constants
strings[0]  = malloc(strAuth) // assign some memory (strAuth number of bytes) to the
                              //   first pointer
strings[0]  = strAuth         // reassign the first pointer the value of strAuth

当您将strAuth分配给strings[0]时,您正在覆盖最初在那里的恶意内容。因此,如果strAuth是一些字符串文字或不是恶意的,那么对 free 的调用确实会失败。您只能释放已动态分配的内容。

因此,您需要决定是否要将指针粘贴到数组中的常量字符串(并且不要malloc或free(,或者是否要malloc/free然后将字符串复制到数组中。

请注意,您与g_free()一起调用malloc()这不是一个好主意。 g_malloc()g_free()不仅仅是free()malloc()的包装器,所以你应该这样使用它们......伪代码说明:

if 
    g_malloc(strings[x]) 
  then 
    g_free(strings[x])
else if 
    strings[x] = malloc(y) 
  then 
    free(strings[x])

相关内容

  • 没有找到相关文章

最新更新