如何检测内存块的分配位置?

时间:2011-05-07 23:08:30

标签: c memory-leaks memory-management dynamic-memory-allocation

可以在堆栈中或堆中静态分配内存块。我想知道一种方法来检测指针是否指向堆。我使用Windows和Linux,每个操作系统的不同解决方案都不是问题。我使用GCC和Mingw。

如果我能知道堆的开始位置和结束位置,我认为问题可以解决。我认为我可以检测堆栈的底部和顶部,以便知道块是否在堆栈中,但是如果有多个线程,则有多个堆栈。即使我知道静态内存在哪里,我想我会遇到共享库的静态内存块问题。

如果指针没有指向块的开头,我想我会遇到问题:

type* x =  &(pointer[3]);

1 个答案:

答案 0 :(得分:3)

你做不到。

您可以尝试在程序开始时在堆上分配内存,并将地址与要释放的指针进行比较,但在许多情况下都不准确。在对内存管理进行一些研究后,您可能会在一个平台上找到并使用的内容可能与下一个平台无关。

另一种方法是在程序中添加一个内存管理模块,它将包装mallocfree等函数,并将跟踪所有已分配的内存并调用{{1}只有当指针出现在他的列表中时。虽然这可能看起来有很多工作可以避免内存泄漏,但我发现它很多次都非常方便。

修改
正如评论中所提到的,最好的决定方法很简单 - 在你知道它是否位于堆上的地方释放它。我不能告诉你在你的情况下是多么容易,但通常它不应该太难,许多程序/程序员之前做过,我怀疑有人真的试图检查内存的分配位置。