C - 释放在另一个文件中分配的堆内存

时间:2011-08-13 07:37:38

标签: c memory malloc heap free

如果您的项目使用了编译多个文件和标题的makefile,这会使堆复杂化吗?

具体做法是: 我有一个main.c文件,其中包含一个标题,例如test.h。在test.c链接到test.h的内存中使用malloc显式分配。 main.c调用test.c中的函数。出于某种原因,当我试图在test.c中的函数内释放内存时,我总是会收到错误:

main(65245) malloc: *** error for object 0x106d012f8: pointer being freed was not allocated
*** set a breakpoint in malloc_error_break to debug
Abort trap: 6

...即使我从来没有,甚至在整个makefile堆栈中根本没有释放任何内存,也会发生此错误。显然stdlib.h包括在内。会发生什么事? main.ctest.c是否有单独的堆,并且无论何时调用后者并返回结果,分配的堆内存是否已被释放?我真的很难过。我可以在main.c中分配和释放内存而不会有任何问题。他们有相同的包括。

3 个答案:

答案 0 :(得分:4)

在运行时没有“不同文件”这样的东西。所有文件都通过链接集成到一个大的二进制代码中。因此,显然只有一个堆。 你的问题必须是别的,因为你从来没有释放过记忆,也许你正试图释放静态分配的内存或类似的东西

另外,请注意,有一种惯例通常可以很好地防止内存泄漏,它说:分配内存的程序部分也负责释放它。它与您的问题没有直接关系,但是为了防止内存泄漏,将来尝试这样做将会有所帮助。

答案 1 :(得分:2)

你是否在每个文件中释放相同的地址/指针?是的,除非你专门尝试获得多个堆,否则你将获得1个堆。我的猜测是你没有释放相同的指针 - 可能是某种寻址/双指针错误。您最好为我们发布一些源代码以确保...

答案 2 :(得分:1)

所有malloc()调用都是从同一个堆中分配的,无论你从哪个文件调用它们。你正在释放一个不是来自任何malloc()调用的指针。

仔细检查您的代码,将已分配和释放的指针值打印到调试日志。