malloc检查站

时间:2012-04-19 12:20:05

标签: c memory-management malloc

我相信有人必须已经实现了这样的东西! 我正在寻找的是能够“检查”堆状态,然后清除自上一个检查点以来发生的所有分配。 基本上我正在寻找的是_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);

3 个答案:

答案 0 :(得分:0)

在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以外的东西)。

答案 1 :(得分:0)

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

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

这样,你可以这样做:

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

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

答案 2 :(得分:0)

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

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

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