代码之家  ›  专栏  ›  技术社区  ›  amit kumar

C++内存分配剖析

  •  38
  • amit kumar  · 技术社区  · 15 年前

    我正在编写一个应用程序,并且惊讶地发现它的总内存使用率已经太高了。我想描述一下我的应用程序的动态内存使用情况:堆中每种类型的对象有多少,以及哪些函数创建了这些对象?另外,每个对象使用了多少内存?

    有简单的方法吗?我同时在linux和windows上工作,所以任何平台的工具都足够了。

    12 回复  |  直到 15 年前
        1
  •  18
  •   James Adkison    8 年前

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

        2
  •  10
  •   sth Wojciech Parzych    13 年前

    为了进行简单的统计,只需找出所有内存的使用位置,可以添加如下模板:

    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();
      ...
    }
    

    这并没有显示对象在哪些函数中被分配,也没有给出太多的细节,但它可能足以确定内存被浪费的位置。

        3
  •  8
  •   Nitin Bhide    15 年前

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

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

    _CrtMemDumpStatistics公司

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

        4
  •  5
  •   Canopus    15 年前

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

    它是我遇到的分析内存使用情况的最好的工具之一。30天评估版可免费下载。

        5
  •  3
  •   Charlie Martin    15 年前

    新的 删除 在C++中,可以用跟踪内存分配和使用的新函数来重载基本的新和删除。

        6
  •  3
  •   Caribou    5 年前

    MTuner -一个免费的C/C++内存剖析器。描述如下:

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

        7
  •  2
  •   j0k BlackMario    12 年前

    我刚刚发布了一个win32本机内存分析器MemPro,作为一个免费的测试版。 http://www.puredevsoftware.com/MemPro.htm

        8
  •  2
  •   abyss.7    10 年前

    试试 gperftools -它可以:

    • 通过直观的图形表示数据,显示精确的函数调用及其继承。
    • 关注可视化图形中特定的代码区域。
    • 显示转储之间的差异。

    而且,它几乎不影响程序的效率。

        9
  •  1
  •   Andy White    15 年前

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

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

        10
  •  1
  •   Michael Burr    15 年前
        11
  •  1
  •   Ricky Lung    14 年前

    第4.6章 Game Programming Gems Volume 8 (Safari Book preview link)详细介绍了由rickylung开发的高级内存分析器,它可以以分层调用堆栈的方式显示分配统计信息,同时还支持多线程。

        12
  •  0
  •   amit kumar    15 年前

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