我想找出软件使用 new/malloc 分配了多少内存。我真的不想要堆的大小,因为分配器很可能使用的比我实际分配的要多。但是我需要这个来检查代码的某个部分分配了多少内存,因此我需要所有新的和malloc大小的准确总和。除了重载new和malloc之外,还有什么方法可以做到这一点吗?
我刚刚开始Linux内核编程。我认为调试堆占用的总内存以调试程序各个部分中的内存使用趋势可能很有用。我知道,有很多有用/强大的工具(例如valgrind(,可以完成这项工作。但这可能需要比必要的更多时间。为了快速掌握,我认为可以使用"&end"全局字符变量(标识堆启动的位置(和"sbrk(0(",它报告"程序中断"地址,例如:
#include <iostream>
#include <unistd.h>
extern char end;
int main(int argc, char* argv[])
{
std::cout << "heap start: " << (void*)&end << 'n';
const int RANDSIZE{20};
void* allocatedPool[RANDSIZE];
for (int i{0}; i<RANDSIZE; ++i)
{
std::cout << "current heap end: " << sbrk(0) << 'n';
allocatedPool[i] = malloc( RANDSIZE * 4096 );
}
}
注意:看起来malloc调用分配的内存比页面多得多,因为计算 https://unix.stackexchange.com/questions/697960/why-malloc-allocates-more-memory-than-neeed 的开销/优化。所以我使用"20"作为乘数来过度分配"程序结束"此外,unistd.h 头文件在内部分配堆,因此它与"(void*(&end"地址不匹配。
方案产出:
current heap end: 0x55f4e3ce1000
current heap end: 0x55f4e3d07000
current heap end: 0x55f4e3d07000
current heap end: 0x55f4e3d2f000
current heap end: 0x55f4e3d2f000
current heap end: 0x55f4e3d57000
current heap end: 0x55f4e3d57000
current heap end: 0x55f4e3d7f000
current heap end: 0x55f4e3d7f000
current heap end: 0x55f4e3da7000
current heap end: 0x55f4e3da7000
current heap end: 0x55f4e3dcf000
current heap end: 0x55f4e3dcf000
current heap end: 0x55f4e3df7000
current heap end: 0x55f4e3df7000
current heap end: 0x55f4e3e1f000
current heap end: 0x55f4e3e1f000
current heap end: 0x55f4e3e47000
current heap end: 0x55f4e3e47000
current heap end: 0x55f4e3e6f000