有没有办法确定'malloc'是否分配了缓冲区?就像具有以下签名的函数一样:
bool is_malloced(void *buf);
posix中是否存在这样的机制?
答案 0 :(得分:2)
不。 C11和POSIX都没有提供任何这样的机制。
答案 1 :(得分:1)
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;
}
当然做这样的事情很疯狂,但你确实可以。
答案 2 :(得分:0)
模仿这种功能的一种简单方法是将malloc()
包装在自定义函数中:
给定一个指针,可以通过查找幻数来检查它是否为malloc
。
当然,这并不完美:
free()
调用中将其设置为null可能会有所帮助。用指针等对它进行异或也可以使它更可靠。不过,这是一种启发式方法。有了所有的缺点,它仍然是一种有用的技术,我在调试嵌入式系统中的一些内存损坏时已经使用了几次。
如果我们要用一些包装器替换malloc()
,我们也可以构建一个已分配块的链表。更可靠,但也更复杂。