C ++中的内存分配概要

时间:2009-03-31 05:16:25

标签: c++ memory-management profiling

我正在编写一个应用程序,我很惊讶它的总内存使用量已经太高了。我想分析我的应用程序的动态内存使用情况:堆中有多少个对象,以及哪些函数创建了这些对象?此外,每个对象使用了多少内存?

有一种简单的方法吗?我正在研究linux和windows,所以任何平台的工具都足够了。

注意:我不关心内存泄漏。

12 个答案:

答案 0 :(得分:14)

你试过Valgrind吗?它是Linux的分析工具。它有一个名为Memcheck的内存检查器(用于内存泄漏和其他内存问题),但它还有一个名为Massif的堆分析器。

答案 1 :(得分:9)

对于简单的统计,只是为了找出所有内存的使用位置,你可以添加这样的模板:

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;

然后,您可以将此作为基类添加到您怀疑拥有大量实例的类中,并打印出当前内存使用情况的统计信息:

class A : Stats<A> {
};

void print_stats() {
  Stats<A>::print();
  Stats<B>::print();
  ...
}

这并没有显示分配对象的功能,也没有给出太多细节,但是我可以找到浪费内存的位置。

答案 2 :(得分:8)

对于Windows,请检查“crtdbg.h”中的函数。 crtdbg.h包含内存分配函数的调试版本。它还包含检测内存泄漏,损坏,检查堆指针有效性等功能。

我认为以下功能对您有用。

_CrtMemDumpStatistics _CrtMemDumpAllObjectsSince

以下MSDN链接列出了堆状态报告功能和示例代码 http://msdn.microsoft.com/en-us/library/wc28wkas(VS.80).aspx

答案 3 :(得分:5)

您可以尝试http://www.softwareverify.com/cpp/memory/index.html

中的Memory Validator

这是我用于分析内存使用情况的最佳工具之一。 30天评估版可以免费下载。

答案 4 :(得分:3)

你可以做几件事。最简单的方法是链接调试malloc库;根据环境的详细信息,可以使用其中的一些(例如,google for _malloc_dbg for Windows。)

第二个选择是你可以在C ++中重载 new delete ;可以使用跟踪内存分配和使用的新函数来重载基本的new和delete。

答案 5 :(得分:3)

MTuner - 一个免费的C / C ++内存分析器。说明如下:

MTuner是一个支持MSVC,GCC和Clang编译器的多平台内存分析,泄漏检测和分析工具。功能包括:基于时间轴的内存活动历史,强大的过滤功能,带完整源代码的手动检测SDK,通过命令行使用的持续集成支持,内存泄漏检测等等。使用GCC或Clang交叉编译器配置任何软件目标平台。内置支持Windows,PlayStation 4和PlayStation 3平台以及基于Windows的交叉编译器的平台。

答案 6 :(得分:2)

我刚刚发布了一个win32原生内存分析器MemPro,作为免费测试版。 http://www.puredevsoftware.com/MemPro.htm。它挂钩到新/删除并将数据发送到外部应用程序,您可以在其中以各种不同的方式查看分配。希望这有帮助。

答案 7 :(得分:1)

在之前的工作中,我们使用了一种名为“Purify”的工具。它是Rational / IBM生产的产品。我不认为这是一个免费的工具,但我记得它很不错。以下是一些信息:

http://en.wikipedia.org/wiki/IBM_Rational_Purify

答案 8 :(得分:1)

来自Game Programming Gems Volume 2Amazon link)的第1.10章详细介绍了Peter Dalton提供的一个简单但有效的Drop-in Debug Memory Manager,它在您转储日志时提供了一组不错的统计信息。

答案 9 :(得分:1)

第3章4.6从Game Programming Gems Volume 8(Safari Book预览链接)详细介绍了Ricky Lung的高级内存分析器,它可以以分层调用堆栈方式显示分配统计信息,但支持多线程。

答案 10 :(得分:0)

刚刚看到AQtime site他们对“分配概要分析”有很好的支持。

答案 11 :(得分:0)

尝试gperftools - 它可以:

  • 一次查看代码的特定部分或整个程序。
  • 通过视觉有向图表示数据,显示确切的函数调用及其继承。
  • 专注于可视化图形中的特定代码区域。
  • 显示转储之间的差异。
  • 显示分配的空间而不是使用 - 所有这些都是使用相同的转储完成的。

此外,它几乎不会影响程序效率。