编写基本的应用程序内存分析:如何计算创建的指针?

Posted

技术标签:

【中文标题】编写基本的应用程序内存分析:如何计算创建的指针?【英文标题】:Programming a basic in-application memory profiling: how to count pointers that are created? 【发布时间】:2017-03-16 09:43:59 【问题描述】:

我有一个 C++ 应用程序,我想为其实现基本的内存分析功能。

对于最重要和最消耗内存的类,我在构造函数、复制构造函数和析构函数中包含了一些代码,用于计算和保存类的每个实例使用的内存量(该代码仅在宏#MEMPROFILE 时运行已定义。类似:

class MyClass

    MyClass()
        #ifdef MEMPROFILE
        calcAndSaveMemUsage();
        #endif
    
...

类似地,析构函数会相应地更新计数器。这样,每当定义用于分析的宏并创建新实例(如MyClass obj)时,都会自动处理内存消耗信息。

有没有办法自动对指针做类似的事情——一般来说,或者那个特定类的指针?比如每次创建指针时自动增加一个计数器?

我有兴趣更多地了解实现这一目标的任何方法,无论是通过重载、包装还是检测。

PS:我知道可以帮助我分析内存的外部工具。我有兴趣了解上面提到的特定内容。

【问题讨论】:

重载newnew[] 运算符怎么样? 也许不是你要找的,但你可以使用std::shared_ptr,然后使用它的use_count()方法 【参考方案1】:

不,这是不可能的。指针不是用户定义的类型。此外,它们可以被memcpy 复制,这意味着编译器甚至可能不知道它正在复制它们。在幕后,std::copy 也可能在可能的情况下使用memcpy,所以不仅仅是显式调用memcpy 会让你感到困惑。

【讨论】:

在这种情况下,换一种方法怎么样:不是包装类或对象,而是覆盖memcpymalloc 和/或使用似乎被称为allocation hook functions 的东西? @Louis15: memcpy 复制字节。无法可靠地确定这些字节是否包含 0、1 或更多指针。至于创建指针,最简单的方法是写&object,根本不涉及任何功能。

以上是关于编写基本的应用程序内存分析:如何计算创建的指针?的主要内容,如果未能解决你的问题,请参考以下文章

作为 Android CI 的一部分运行一些内存分析

实验11——指针的基础应用

linux内核分析--计算机是如何工作的

shell脚本中如何编写程序med.sh,根据free命令的结果计算内存占有率

SWIG C++ TCL:处理内存中预先存在的对象

day4笔记(指针结构体入门介绍)