gpt4 book ai didi

c - free 会导致内存损坏

转载 作者:行者123 更新时间:2023-11-30 20:46:21 26 4
gpt4 key购买 nike

friend 们,我正在尝试从指针数组中释放内存:

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:%d\n",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, ",\n\t%s=\"%s\"",
keyword[i], strings[i]);
g_free((char*)strings[i]);
strings[i]=NULL;
g_print("Cleaned:%d\n",i);
}
i++;
}

最佳答案

首先,这个

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

肯定坏了。 strAuth 的类型是什么?您如何设法使用 strAuth 作为 malloc 的参数(即大小),然后立即作为分配的右侧大小? malloc的参数必须是整数,而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 来释放它。

关于c - free 会导致内存损坏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17050939/

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