【问题标题】:C Memory Leak passing argument?C内存泄漏传递参数?
【发布时间】:2020-12-30 23:18:27
【问题描述】:

所以我的 gcc 编译器说:

=================================================================
==831==ERROR: AddressSanitizer: heap-buffer-overflow on address 0x60c000001d3c at pc 0x7fcb29c87075 bp 0x7ffe0bf63e70 sp 0x7ffe0bf635e8
READ of size 121 at 0x60c000001d3c thread T0

我将一个 char *list = argv[1] 传递给一个函数。会不会是这个原因?

【问题讨论】:

  • 消毒剂说你有缓冲区溢出,而不是内存泄漏。顺便说一句,有两个变量名为 sls1 可能会造成混淆。
  • s1 也从未使用过
  • WriteAfterMathData 中的缩进与大括号 {...} 不匹配。这是您的真实代码还是您不小心删除了大括号?在不知道结构定义、如何分配内存以及传递给函数的具体内容的情况下,很难找出问题所在。
  • @Blastfurnace 那么我应该在哪里看?我通过 char *name = argv[4]; 在 main 中读取了一个动态值;并将其作为参数传递给 RemoveCity。你认为这可能会导致这种情况吗?至于其他人: fclose 在迭代之外,但由于某些原因我无法编辑我的帖子(它说它现在主要包含代码)。 s1 仅用于调试目的。
  • 您可能读/写超出了数组的末尾,或者您的指针无效。我会在调试器中运行代码,在fprintf 处设置断点,然后查看变量。

标签: c gcc memory-leaks


【解决方案1】:

您正在多次关闭文件。

for (int i = 1; i < sl->count; i++)
{
    if (sl->stadt[i]->stadtId != s->stadtId)
    {
        s1 = sl->stadt[i];
        fprintf(file, "%d %s %d \n", sl->stadt[i]->stadtId, sl->stadt[i]->name, sl->stadt[i]->gebietId);
    }
fclose(file); // Being called several times on the loop!
} 

如您所见,fclose(file) 在 for 循环内,据我所知,它被多次调用,这可能是导致问题的原因。

你可以做什么: 如果您想在文件中打印后关闭文件,可以将 fclose(file) 放在 if 语句中并像这样中断循环:

for (int i = 1; i < sl->count; i++)
{
    if (sl->stadt[i]->stadtId != s->stadtId)
    {
        s1 = sl->stadt[i];
        fprintf(file, "%d %s %d \n", sl->stadt[i]->stadtId, sl->stadt[i]->name, sl->stadt[i]->gebietId);
        fclose(file);
        break;
    }
}

如果 print 被多次调用,你只需要将 fclose(file) 移出 for 循环,如下所示:

for (int i = 1; i < sl->count; i++)
{
    if (sl->stadt[i]->stadtId != s->stadtId)
    {
        s1 = sl->stadt[i];
        fprintf(file, "%d %s %d \n", sl->stadt[i]->stadtId, sl->stadt[i]->name, sl->stadt[i]->gebietId);
    }
}
fclose(file);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-10-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-01-27
    • 2010-11-11
    • 2017-02-18
    相关资源
    最近更新 更多