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])