检查指针是否指向堆上已分配的内存

log*_*og0 15 c c++ malloc pointers memory-management

我想知道指针是否指向一个用malloc/new分配的内存.我意识到任意地址的答案是"不,你不能",但我认为可以覆盖malloc/free并跟踪分配的内存范围.

您是否知道提供此特定工具的内存管理库?
你知道生产代码吗?

Valgrind很棒,但是仪表太多了(慢)并且Will说我们不想像这样使用Valgrind(使得软碰撞足够好).
Mudflap是一个非常好的解决方案,但是专门用于GCC,遗憾的是,检查不会简单地返回一个布尔值(请参阅下面的答案).
请注意,检查内存写入是否合法是一个安全问题.所以寻找表现是有动力的.

小智 12

证明它可能无法有效完成:

char * p1 = malloc(1);
free( p1 );
char * p2 = malloc(1);   // probably allocates same block as first malloc
Run Code Online (Sandbox Code Playgroud)

现在p1和p2都指向堆上的相同内存,但只有p2有效.

  • 在哲学上它可能令人失望,但如果它最终p2指向与p1相同的地址,则p1仍然是可修改存储器的地址.所以这对我来说没问题. (7认同)

Chr*_*odd 10

没有标准的方法可以做到这一点,但各种malloc调试工具可能有办法做到这一点.例如,如果您使用valgrind,您可以使用它VALGRIND_CHECK_MEM_IS_ADDRESSABLE来检查这个和相关的事情

  • valgrind太棒了. (3认同)
  • 如果你正在使用valgrind,你不检查东西是否可以解决你只是让valgrind在你有bug的时候爆炸,然后修复它:) (2认同)

And*_*ndy 5

如果性能不是您的应用程序的真正问题,您可以自己执行此操作:

定义MyMalloc(...)和MyFree(...),其中,与调用malloc/free一起,更新一个(有序的)对列表{address - malloc的结果,blockSize - 请求的内存的amt }.然后当你需要检查指针p时,你会找到一对满足:address <= p <= address + blockSize.

可以/应该检查其他条件,如果你想实际使用那个指针,这只会告诉你地址是否正在使用.