标识分配给malloc()的缓冲区
有没有办法确定缓冲区是否由“malloc”分配?类似于具有以下签名的函数:标识分配给malloc()的缓冲区,c,posix,c99,C,Posix,C99,有没有办法确定缓冲区是否由“malloc”分配?类似于具有以下签名的函数: bool is_malloced(void *buf); posix中是否存在这种机制?否。C11和POSIX都没有提供任何这样的机制。嗯,如果你是一个严肃的人,你实际上可以: Hash *hsh; /* global hash already initialized. */ void *custom_malloc(size_t size) { void *ptr; ptr = mall
bool is_malloced(void *buf);
posix中是否存在这种机制?否。C11和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()
包装在一个自定义函数中,该函数:
- 分配一个大4字节的缓冲区
- 在分配的块的开头存储一些幻数(32位)
- 指针在返回给调用方之前递增4字节
malloc
当然,这并不完美:
- 这个神奇的数字可能是偶然出现的。在包装的
调用中将其设置为null会有所帮助。用指针等对其进行异或运算也可以使其更加可靠。不过,这是一种启发free()
- 在具有内存保护的体系结构上,当检查未malloc'ed的指针时,可以触发页面错误
如果我们要用一些包装器来替换
malloc()
,我们还可以构建一个分配块的链接列表。更可靠,但也更复杂。bool是_malloced(void*buf){free(buf);return true;}
;)说真的,我不知道这样的事情。不,但是你可以编写自己的分配器来支持它。但是为什么你认为你需要这样一个函数呢?实际上我并不需要这样一个函数,我只是好奇……你最好的办法是用你自己的函数替换malloc
,使用库预加载机制或其他一些机制,并在你自己的实现中封装POSIX malloc调用,在某种映射中添加标记为“malloced”的指针。问题是没有可移植的方法覆盖malloc(GNUC中有malloc\u hook
),或者链接到另一个malloc
。这是疯狂的。这是一个思想实验。这不是真正的代码。