我有一个长时间运行的 C++ 程序,通常使用 gcc (g++) 编译。我已经使用 valgrind 来验证没有内存泄漏,所以我不是在寻找泄漏检测器。
不过,我关心的是临时缓冲区/对象上的内存碎片和不必要的新/删除对。
有没有办法记录所有对 new 的调用(即使它们发生在 STL 容器内),提供堆栈跟踪以便我可以在我的代码中找到它们?我尝试了 mtrace,但这只适用于 C++——当我查找负责的代码行时,它最终说所有分配都发生在全局新分配器中。不知何故,valgrind 的 memcheck 几乎可以做我想做的,因为它显示了内存分配的堆栈跟踪。不幸的是,它们似乎只为分配而呈现,没有匹配的释放。
最佳答案
如果您想跟踪有关分配的其他统计信息,您始终可以因此覆盖全局新建/删除函数:
void* operator new (size_t size)
{
void *pPtr = alloc_memory(size); /* perform the allocation here but don't use new! */
if(pPtr == 0)
throw std::bad_alloc();
/* additional code here to do whatever sort of tracking you want */
return pPtr;
}
void operator delete (void *pPtr)
{
if(pPtr == 0)
return; // legal to call delete on NULL pointers - don't pass NULL to free()
/* additional code to do whatever tracking you want here */
free(pPtr);
}
至于获取回溯,这取决于编译器和 O/S,并且没有标准的方法来获取它。由于您提到 GCC,以下内容可能对您有用:
http://tombarta.wordpress.com/2008/08/01/c-stack-traces-with-gcc/
关于c++ - 有没有办法在 C++ 中调用 new 时获取堆栈跟踪?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11057207/