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

标签 c segmentation-fault malloc free

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

相关文章:

c++ - 成功打印超出范围的字符串索引

c - 优化版本代码中的 SIGSEGV

带数组的c函数没有返回值

c++ - #ifdef标志来说明gcc和g++编译器之间的区别?

c - 为什么在输入大于 9 x 的值后无法输入更多输入?

c - 在子进程中执行文件

c - 如何创建指向 NULL 的结构指针数组

c - 如何转换将整数值的长度和由该值组成的字节字符串复制到任意字节的C代码?

c++ - 有没有办法获取在处理信号期间访问的指针?

释放后还能打印字符串吗?