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