我需要知道我的计划中的哪个地方是malloc
/ new
,并且对于每个这样一个不同的地方,多少次。作为关于内存分配的自上而下函数调用分析。
是否有任何工具可以收集此类统计信息? (malloc
/ new
主要通过std::vector
成员函数调用。)
答案 0 :(得分:2)
大多数C ++运行时的调试版本提供了一定级别的调试挂钩来协助分配等。
更可定制的替代方法是编写您自己的operator new
和operator delete
等,以提供您想要的功能(例如,接受文件,行和函数名称作为参数,并在内部完成计数和记录)。使用预处理器__FILE__
,__LINE__
等连接它们,为方便起见,使用宏来替换new
和delete
(ATL / MFC使用此技术)。
如果焦点集中在一个容器上,最好只需编写自己的分配器并用它创建vector
。
std::vector<int, MyAllocator> my_vector;
// or...
using MyVector = std::vector<int, MyAllocator>;
MyVector my_vector;
替换new
和delete
;
void* operator new(std::size_t count, int line, char const* file)
{
auto p = ::malloc(count);
std::printf("Allocate new @ %s:%d (%p)\n", file, line, p);
return p;
}
void operator delete(void* pointer) noexcept
{
std::printf("Deallocate pointer (%p)\n", pointer);
::free(pointer);
}
#define NEWIT new (__LINE__, __FILE__)
#define new NEWIT
int main()
{
//auto p = new (__LINE__, __FILE__) int{};
auto p = new int{};
delete p;
}
答案 1 :(得分:2)
我刚刚发现Valgrind完全符合我的需要。也就是说,使用Kcachegrind或Qcachegrind中的Callgrind工具和可视化,它向我显示了每个边缘调用次数的调用图。希望这对其他人也有帮助。
答案 2 :(得分:0)
Open|SpeedShop工具可以进行内存跟踪分析。它提供的数据在User Manual,第96页中描述。它似乎提供了呼叫路径和呼叫数。
请注意,Open | SpeedShop可能很难构建。 Here's构建指南,请注意您的操作系统的必备软件包列表。你需要建立&#34; CBTF&#34;版本以启用内存跟踪分析。