【发布时间】:2011-06-27 20:26:42
【问题描述】:
我编写了一个函数来测试给定路径是否是有效的 Maildir 目录(标准 Maildir 具有三个子文件夹 "cur" "new" 和 "tmp" )。函数接受假定的目录,检查那些子文件夹,并适当地返回。
我在当前代码的第二个免费语句中遇到了段错误,并且我同样遇到了“无效的下一个大小”错误,代码的组织略有不同。更令人困惑的是,它仅在某些目录上出现段错误,而在其他目录上成功完成,没有明显的原因(尽管它会在哪些目录上出现段错误)。注释掉第二个 free() 后,所有格式准确的目录都成功完成。
显然我是双重释放。我的问题是,为什么以及如何?如果第一个 free 在条件语句中并且我们在释放后立即返回,我们永远不会到达第二个 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
}
【问题讨论】:
-
为什么不在调试器中运行你的代码,然后当它崩溃时,检查回溯以确定你在哪里?
标签: c segmentation-fault malloc free