在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声明为全局并在所有函数中使用它。问题是当内存被释放时,无法知道释放了多少内存,所以在这种情况下如何更新内存。
答案 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,还可以获得所有其他分配。
但请注意,内存挂钩在多线程环境中运行,即使您的应用程序是单线程的,也可能在其他线程中发生很多事情。
没有受到良好保护的代码可能会导致死锁 - 请参阅自述文件中的代码设计。