我想在多线程环境中重载new运算符,并希望在其中包含线程ID,函数名和行号。有没有办法做到这一点?
答案 0 :(得分:2)
您可以制作新的operator new
重载:
void * operator new(std::size_t count, const char* file, int line)
{
// Do stuff
// ...
return ::operator new(count);
}
void * operator delete(void* p, const char* file, int line)
{
// Do stuff
// ...
return ::operator delete(p);
}
// ... and [] versions ..
然后您可以使用放置语法:
auto x = new (__FILE__, __LINE__) Foo;
然后你可以添加一个宏:
#define TRACE_NEW new (__FILE__, __LINE__)
auto x = TRACE_NEW Foo;
答案 1 :(得分:0)
一般来说,没有办法做你想做的事情(除了当然使用像moldbnilo answered这样的宏,或者未来std::source_location)
但是,如果您使用的是最近的Linux系统,并且所有代码(以及它使用的大多数库,包括libstdc++
)都是使用调试选项编译的,那么您也可以考虑Ian Taylor&#39 ; s libbacktrace(它也在GCC中使用)并在operator new
实施中使用它。使用libbacktrace
operator new
可以使用call stack调试信息检查DWARF中的调用帧。
您甚至可以在call stack中找到大多数功能的来源位置(尤其是-g
来电者的来源位置)。
请记住,您可以使用调试信息(例如-O1
)和一些优化标记(例如-O2
或者可能编译一些C ++代码(使用GCC或Clang) -fsanitize=address
);当然,调试信息(在DWARF中)将是"模糊"但在实践中仍然可以使用。