如果您的项目使用了编译多个文件和标题的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.c
和test.c
是否有单独的堆,并且无论何时调用后者并返回结果,分配的堆内存是否已被释放?我真的很难过。我可以在main.c
中分配和释放内存而不会有任何问题。他们有相同的包括。
答案 0 :(得分:4)
在运行时没有“不同文件”这样的东西。所有文件都通过链接集成到一个大的二进制代码中。因此,显然只有一个堆。 你的问题必须是别的,因为你从来没有释放过记忆,也许你正试图释放静态分配的内存或类似的东西
另外,请注意,有一种惯例通常可以很好地防止内存泄漏,它说:分配内存的程序部分也负责释放它。它与您的问题没有直接关系,但是为了防止内存泄漏,将来尝试这样做将会有所帮助。
答案 1 :(得分:2)
你是否在每个文件中释放相同的地址/指针?是的,除非你专门尝试获得多个堆,否则你将获得1个堆。我的猜测是你没有释放相同的指针 - 可能是某种寻址/双指针错误。您最好为我们发布一些源代码以确保...
答案 2 :(得分:1)
所有malloc()调用都是从同一个堆中分配的,无论你从哪个文件调用它们。你正在释放一个不是来自任何malloc()调用的指针。
仔细检查您的代码,将已分配和释放的指针值打印到调试日志。