有没有办法识别一个缓冲区是否是通过'malloc'函数分配的?类似于以下签名的函数:
bool is_malloced(void *buf);
这种机制在posix中存在吗?
如果你是一个认真的人,你实际上可以做到:
Hash *hsh; /* global hash already initialized. */
void *custom_malloc(size_t size)
{
void *ptr;
ptr = malloc(size);
hash_add(hsh, ptr);
return ptr;
}
/* tester */
_Bool malloced(void *ptr)
{
if(hash_retrieve(hsh, ptr))
return TRUE;
return FALSE;
}
当然,这样做是疯狂的,但确实可以。
一种简单的模拟此功能的方法是将malloc()
封装在一个自定义函数中,该函数:
通过给定指针,可以检查它是否是由malloc
分配的。
当然,这并不完美:
free()
调用中将其设置为null可以帮助。与指针进行异或等操作也可以使其更可靠。但仍然是一种启发式方法。尽管存在所有这些缺点,但这仍然是一种有用的技术,我在调试嵌入式系统中的某些内存损坏时使用过几次。
如果我们要用某个包装器替换malloc()
,我们也可以构建一个已分配块的链接列表。更可靠,但也更复杂。
bool is_malloced(void *buf) { free(buf); return true; }
;) 说真的,我不知道有这样的东西。 - Daniel Fischermalloc
为自己的实现,并在你自己的实现中包装POSIX malloc调用,将指针标记为“已分配”,并存储在某种映射表中。问题在于没有一种可移植的方式来覆盖malloc(在GNU C中有malloc_hook
)或链接到另一个malloc
。 - Armen Michaeli