gpt4 book ai didi

c - 在 Debian 上使用 gcc 4.7.2-5 无效释放/删除,而在 Ubuntu/Linaro 上使用 gcc 4.8.1 一切正常

转载 作者:太空宇宙 更新时间:2023-11-04 03:46:10 25 4
gpt4 key购买 nike

我有一些代码行是更大项目的一部分。我用 gcc (Debian 4.7.2-5) 编译的代码在用 valgrind 分析时显示一些 invalid free/delete 错误。然而,当我用 gcc (Ubuntu/Linaro 4.8.1) 编译它时,错误消失了。

这是错误信息:

==4505== Invalid free() / delete / delete[] / realloc()
==4505== at 0x4C27D4E: free (vg_replace_malloc.c:427)
==4505== by 0x401195: method (test.c:202)
==4505== by 0x401429: main (test.c:264)
==4505== Address 0x401600 is not stack'd, malloc'd or (recently) free'd
==4505==
Linux ==4505==
==4505== HEAP SUMMARY:
==4505== in use at exit: 0 bytes in 0 blocks
==4505== total heap usage: 1,394 allocs, 1,395 frees, 95,379 bytes allocated
==4505==
==4505== All heap blocks were freed -- no leaks are possible
==4505==
==4505== For counts of detected and suppressed errors, rerun with: -v
==4505== ERROR SUMMARY: 1 errors from 1 contexts (suppressed: 4 from 4)

下面是失败的代码:

for (i = 0; etcFilenames[i] != NULL; i++)
{
for (j = 0; j < OS_NUM; j++)
{
if (!strcmp(etcFilenames[i], releaseFilenames[j]))
{
filename = (char *)releaseFilenames[j];
char *tmp = readEtcFile(filename);

if (strlen(tmp) == 0)
{
free(tmp);
continue;
}
else
{
name = malloc(sizeof(char) * (strlen(tmp) + 1));
strcpy(name, tmp);
free(tmp);
break;
}
}
}
}

if (uname(&sysInfo) != -1)
{
len = sizeof(sysInfo.sysname) + strlen(name) + 1;
os->sysname = malloc(sizeof(char) * len);
memset (os->sysname, 0, len);
strcpy(sysname, sysInfo.sysname);
strcat(sysname, " ");
strcat(sysname, name);

version = malloc(sizeof(char) * (sizeof(sysInfo.release) + 1));
memset (version, 0, sizeof(sysInfo.release));
strcpy(version, sysInfo.release);

free(name);
}

Valgrind 提示最后一行:free(name); 当所有使用的变量声明如下时:

struct utsname sysInfo;
FILE *osArch, *distribName;
char *arch, *name = "";
char buff[1024];
int len = 0;
char **etcFilenames = getEtcFilenames();
unsigned int i = 0, j = 0;

const char *releaseFilenames[OS_NUM];
char *filename = "";

我主要担心的是,我不知道出现错误是我的错,还是 gcc 问题?我怎么知道哪个版本好? (当我在 (Debian 4.7.2-5) gcc 上注释掉 free(name); 时,它就可以了,但是 gcc 4.8.1提示内存泄漏......)

最佳答案

当您尝试释放未分配的内存块时,将显示该错误。如果您不在 valgrind 中运行它,它可能会崩溃。

这将来自几个原因之一。

  1. 您实际上并没有使用指针。如果您像在下面的第一个示例中那样声明它是错误的,您将得到错误,因为您试图释放一个 int,而不是指向 int 的指针。

    整数 * a, b;

    ...

    免费(b);

  2. 您手动设置的值有误。指针,就像 C 中的任何东西一样,可以自由转换,并可以自由地分配不同类型的变量。这允许您无意中将指针的值更改为实际的文字数值。这将指向非 malloced 内存,并失败。

    整数 * a;

    a = malloc(sizeof(int));

    (int) a = 4;

    免费(一);

  3. 一个更具体的例子,但是创建变量的实例之前已经被销毁,并且程序已经执行了足够长的时间以至于它已经脱离了valgrind表并且不会再产生错误。这是双重释放的结果。您可能不会遇到这种情况。

关于c - 在 Debian 上使用 gcc 4.7.2-5 无效释放/删除,而在 Ubuntu/Linaro 上使用 gcc 4.8.1 一切正常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24249459/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com