gpt4 book ai didi

c - malloc/free,似乎获得了多次释放

转载 作者:太空宇宙 更新时间:2023-11-04 00:54:43 25 4
gpt4 key购买 nike

我编写了一个函数来测试给定路径是否为有效的 Maildir 目录(标准 Maildir 具有三个子文件夹“cur”、“new”和“tmp”)。函数接受假定的目录,检查这些子文件夹,然后适本地返回。

我在当前代码的第二个自由语句处遇到了段错误,并且我同样遇到了组织略有不同的代码的“无效的下一个大小”错误。更令人困惑的是,它只在某些目录上发生段错误,而在其他目录上成功完成,没有明显的原因(尽管它会在哪些目录上发生段错误是一致的)。注释掉第二个 free() 后,所有格式准确的目录都成功完成。

显然,我正在双重释放。我的问题是,为什么以及如何?如果第一个 free 在条件语句中并且我们在释放后立即返回,我们永远不会得到第二个 free。如果我们免费获得第二个,那就意味着我们跳过了第一个……对吧?

我意识到在这种情况下它非常好,因为系统会在程序结束时回收内存,但我更感兴趣的是发生这种情况的原因,而不是仅仅让代码工作。如果我正在考虑不同的情况,函数调用的函数调用函数等等,内存可能是一个问题怎么办?我不需要那个 2nd free 来回收内存吗?

int is_valid_folder(char* maildir)
{
struct stat *buf;
buf = (struct stat *) malloc(sizeof(struct stat));

char* new = strdup(maildir);
char* cur = strdup(maildir);
char* tmp = strdup(maildir);
strcat (cur, "/cur"); strcat (new, "/new"); strcat (tmp, "/tmp");

if(stat(cur, buf) || stat(tmp, buf) || stat(new, buf))
{
printf("Problem stat-ing one of the cur/new/tmp folders\n");
printf("Error number %d\n", errno);
free(buf);
return 1;
}

free(buf);
return 0; //a valid folder path for this function
}

最佳答案

您有几个缓冲区溢出:strdup() 可能分配了一个刚好足以容纳 maildir 字符串的 char 数组,并且对 strcat() 的调用将导致数组溢出。 (strcat(),与 strdup() 不同, 创建一个新的 char 数组,所以您必须自己确保给它的数组足够大以容纳结果字符串。)

顺便说一下,valgrind在跟踪内存管理错误方面是您的 friend 。

关于c - malloc/free,似乎获得了多次释放,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6498546/

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