我编写了一个函数来测试给定路径是否为有效的 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/