1

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

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

//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);
4

3 回答 3

0

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

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

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

于 2013-03-30T07:56:20.320 回答
0

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

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

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

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

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

于 2012-05-15T15:23:11.837 回答
0

在 C 中没有使用标记/释放内存分配的标准方法。如果您知道所有malloc/ free calls will be used in a LIFO fashion, you may be able to link in your ownmalloc /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()任何块也将释放以后分配的所有块。如果外部代码不malloc/free按 LIFO 顺序使用,则可以使用另一种方法,但如果在您的代码这样做之前不释放块,则可以free()不做任何事情,但有一些其他功能像free上面一样。更复杂的变化也是可能的,但在第一种方法就足够的情况下,它的效率是无可匹敌的。非常适合嵌入式系统(尽管我通常将其称为 malloc 以外的其他名称)。

于 2012-04-20T16:32:50.430 回答