【问题标题】:malloc/free, appear to be getting multiple freesmalloc/free,似乎正在获得多个免费
【发布时间】: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


【解决方案1】:

您有几个缓冲区溢出:strdup() 可能分配了一个足够大以容纳 maildir 字符串的 char 数组,然后对 strcat() 的调用将溢出数组。 (strcat(),相对于strdup()创建一个新的char 数组,所以你必须确保你给它的数组足够大保存结果字符串。)

顺便说一句,valgrind 是您追踪内存管理错误的好朋友。

【讨论】:

    【解决方案2】:

    重复字符串中没有足够的空间用于连接。

    尝试:

    char* new = (char*)calloc(strlen(maildir) + 5);
    

    【讨论】:

      【解决方案3】:

      我知道你明白了,但只是作为提示......(评论太大)

      检查strdup() 的返回值是否有NULLfree() 完成这些指针。如果您不这样做,内存将泄漏(它在您当前的代码中泄漏)。

      strdup() 函数将返回一个指向新字符串的指针,该字符串是 s1 指向的字符串的副本。 返回的指针可以传递给free()。如果无法创建新字符串,则返回空指针。

      【讨论】:

        猜你喜欢
        • 2010-12-16
        • 2017-02-25
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多