C - 马洛克检查站



我相信一定有人已经实现了这样的东西!我正在寻找的是"检查点"堆状态,然后清除自上一个检查点以来发生的所有分配的能力。基本上,我正在寻找的是_CrtMemCheck Apis的自然推论。

类似的东西(最好是跨平台的)

//we save the heap state here in s1
_CrtMemCheckpoint( &s1 );
//allocs and frees
//Get rid of all allocs since checkpoint s1 that have not been freed!
_CrtMemClearAllObjectsSince(&s1);

在 C 语言中使用标记/释放内存分配没有标准方法。 如果您知道所有 malloc/free calls will be used in a LIFO fashion, you may be able to link in your own malloc / free' 函数,请使用如下所示的内容:

#define MY_HEAP_SIZE 12345678
unsigned char my_mem[MY_HEAP_SIZE];
unsigned char *my_alloc_ptr = my_mem;
void *malloc(size_t size)
{
  void *ret = my_alloc_ptr;
  if (size <= MY_HEAP_SIZE && ((my_alloc_ptr - my_mem)+size) <= MY_HEAP_SIZE)
  {
    my_alloc_ptr += size;
    return (void*)ret;
  }
  else
    return (void*)0;
}
void free(void *ptr)
{
  if (ptr)
    my_alloc_ptr = ptr;
}

此方法要求每个分配块的开销为零字节,但在任何块上调用free()也将释放以后分配的所有块。 如果外部代码不按 LIFO 顺序使用malloc/free,则可以使用另一种方法,但如果块在您的代码这样做之前没有释放,则可以使free()什么都不做,但具有一些其他功能,其行为类似于上面的free。 更复杂的变化也是可能的,但是在第一种方法就足够的情况下,它的效率是无与伦比的。 对于嵌入式系统来说非常好(尽管我通常称它为malloc以外的其他东西)。

您可以使用钩子修改 malloc()/free() 来记住分配的内存(例如,假设您在指针数组中记录新指针)。然后你可以有两个函数:

  • int get_checkpoint() ,返回下一个自由数组索引,
  • void free_until(int checkpoint) ,这会从数组中当前存储的指针向后释放内存,直到达到checkpoint

这样,您可以执行以下操作:

int cpoint = get_checkpoint();
LibraryDoSomething();
free_until(cpoint);

当然,这种技术仍然很危险;调用 C 库函数可能会产生很容易影响的副作用。最好的建议仍然是阿马尔迪普的建议。

另一个可能且有趣的解决方案可能是使用LD_PRELOAD。正如 LD_PRELOAD 的手册页所述"这可用于有选择地覆盖其他共享库中的函数"。

因此,您可以拥有自己的 malloc 和 free 实现,其中您可以实现所需的检查,然后调用默认的 malloc 或 free。

您可以在此处查看详细信息:http://somethingswhichidintknow.blogspot.com/2009/10/dll-injection.html

相关内容

  • 没有找到相关文章

最新更新