C++中的内存分配概要

ami*_*mit 39 c++ profiling memory-management

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

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

注意:我不关心这里的内存泄漏.

jav*_*anz 15

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

  • 有没有办法使用valgrind massif来分析每个对象类型使用的对象计数和总内存? (3认同)

sth*_*sth 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;
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)

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

  • 如果你这样做,请记住这不是线程安全的.你可以使用`std :: atomic`(如果你有C++ 11)或`boost :: atomic`来增加/减少. (4认同)

Nit*_*ide 8

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

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

_CrtMemDumpStatistics _CrtMemDumpAllObjectsSince

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

  • 该链接已失效,可能是 http://msdn.microsoft.com/en-us/library/aa269809(v=vs.60).aspx 或 http://msdn.microsoft.com/en-us/library/974tc9t1 .aspx? (2认同)

Can*_*pus 5

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

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


小智 5

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

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


And*_*ite 1

在之前的工作中,我们使用了一个名为“Purify”的工具。它是 Rational/IBM 制造的产品。我不认为这是一个免费工具,但我记得它非常好。这是一些信息:

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

  • Purify 告诉您有关内存损坏和泄漏的信息,而不是分配对象的大小 (2认同)