ami*_*mit 39 c++ profiling memory-management
我正在编写一个应用程序,我很惊讶它的总内存使用量已经太高了.我想分析我的应用程序的动态内存使用情况:堆中有多少个对象,以及哪些函数创建了这些对象?此外,每个对象使用了多少内存?
有一个简单的方法吗?我正在研究linux和windows,所以任何平台的工具都足够了.
注意:我不关心这里的内存泄漏.
对于简单的统计信息,只是为了找出所有内存的使用位置,您可以添加如下模板:
template<class T>
class Stats {
static int instance_count;
public:
Stats() {
instance_count++;
}
~Stats() {
instance_count--;
}
static void print() {
std::cout << instance_count << " instances of " << typeid(T).name() <<
", " << sizeof(T) << " bytes each." << std::endl;
}
};
template<class T>
int Stats<T>::instance_count = 0;
Run Code Online (Sandbox Code Playgroud)
然后,您可以将此作为基类添加到您怀疑拥有大量实例的类中,并打印出当前内存使用情况的统计信息:
class A : Stats<A> {
};
void print_stats() {
Stats<A>::print();
Stats<B>::print();
...
}
Run Code Online (Sandbox Code Playgroud)
这并没有向您展示对象分配的功能,也没有给出太多细节,但我可以找到浪费内存的位置.
对于Windows,请检查"crtdbg.h"中的函数.crtdbg.h包含内存分配函数的调试版本.它还包含用于检测内存泄漏,损坏,检查堆指针的有效性等的功能.
我认为以下功能对您有用.
_CrtMemDumpStatistics _CrtMemDumpAllObjectsSince
以下MSDN链接列出了堆状态报告功能和示例代码 http://msdn.microsoft.com/en-us/library/wc28wkas(VS.80).aspx
您可以从http://www.softwareverify.com/cpp/memory/index.html尝试Memory Validator
它是我用于分析内存使用情况的最佳工具之一.30天评估版可免费下载.
在之前的工作中,我们使用了一个名为“Purify”的工具。它是 Rational/IBM 制造的产品。我不认为这是一个免费工具,但我记得它非常好。这是一些信息:
http://en.wikipedia.org/wiki/IBM_Rational_Purify