编写基本的应用程序内存分析:如何计算创建的指针?
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:我知道可以帮助我分析内存的外部工具。我有兴趣了解上面提到的特定内容。
【问题讨论】:
重载new
和new[]
运算符怎么样?
也许不是你要找的,但你可以使用std::shared_ptr
,然后使用它的use_count()
方法
【参考方案1】:
不,这是不可能的。指针不是用户定义的类型。此外,它们可以被memcpy
复制,这意味着编译器甚至可能不知道它正在复制它们。在幕后,std::copy
也可能在可能的情况下使用memcpy
,所以不仅仅是显式调用memcpy
会让你感到困惑。
【讨论】:
在这种情况下,换一种方法怎么样:不是包装类或对象,而是覆盖memcpy
、malloc
和/或使用似乎被称为allocation hook functions 的东西?
@Louis15: memcpy
复制字节。无法可靠地确定这些字节是否包含 0、1 或更多指针。至于创建指针,最简单的方法是写&object
,根本不涉及任何功能。以上是关于编写基本的应用程序内存分析:如何计算创建的指针?的主要内容,如果未能解决你的问题,请参考以下文章