跟踪c / c ++中的动态内存分配

时间:2013-03-18 18:47:27

标签: c++ c memory-management

在c或c ++中,有没有办法跟踪动态分配的内存。说我有这样的代码

void somefunction(some arguments,long mc){
//allocate b bytes of memory using malloc,calloc or new
mc += b;


//allocate once again, say p bytes
mc += p;


//deallocate q bytes using delete or free()
mc -= q;

print "mc bytes allocated at this point";

} 

可以将mc声明为全局并在所有函数中使用它。问题是当内存被释放时,无法知道释放了多少内存,所以在这种情况下如何更新内存。

5 个答案:

答案 0 :(得分:3)

为malloc(),calloc和free()创建包装函数。在malloc / calloc中,分配额外的字大小以维持要分配的内存量,并总结在mc中分配的字节数。在空闲时,读取第一个头字节以了解要释放多少内存,并从mc中减小相同的大小。

答案 1 :(得分:1)

使用包装器会产生开销,仅仅为了调试目的,我更喜欢挂钩malloc / calloc / free / etc,只是转储有关他们正在做什么的信息。

这样做的好处是,当你去发布时(不再需要调试内容)你只需删除挂钩功能就可以了。

答案 2 :(得分:0)

您无法直接使用long。为long课程设置MyLong并为您的课程重载operator new。这将跟踪堆中的内存分配。

答案 3 :(得分:0)

您可以使用custom memory allocator来跟踪内存分配。有关参考实现,请参阅Doug Lea's one

答案 4 :(得分:0)

拦截内存分配例程,就像内存泄漏检测工具中所示:

https://sourceforge.net/projects/diagnostic/ http://diagnostic.sourceforge.net/index.html

(甚至可能将其集成到您的应用程序中)。

您不仅可以获得malloc,realloc,free,还可以获得所有其他分配。

但请注意,内存挂钩在多线程环境中运行,即使您的应用程序是单线程的,也可能在其他线程中发生很多事情。

没有受到良好保护的代码可能会导致死锁 - 请参阅自述文件中的代码设计。