0

在 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 声明为全局并在所有函数中使用它。问题是当内存被释放时,没有办法知道刚刚释放了多少内存,所以在这种情况下如何更新 mc 。

4

5 回答 5

3

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

于 2013-03-18T18:58:33.293 回答
1

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

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

于 2013-03-18T19:40:37.237 回答
0

您无法long直接使用它。long用类包装MyLong并为您的类重载operator new。这将跟踪堆中的内存分配。

于 2013-03-18T18:50:51.870 回答
0

您可以使用自定义内存分配器来跟踪内存分配。请参阅Doug Lea 的参考实现

于 2013-03-18T18:51:01.537 回答
0

拦截内存分配例程,就像它在内存泄漏检测工具中显示的那样:

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

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

您不仅会获得 malloc、realloc、free,而且还会获得所有其他分配。

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

没有得到很好保护的代码会导致死锁 - 请参阅自述文件中我的代码设计。

于 2016-11-03T17:51:37.943 回答