【发布时间】:2020-03-07 09:26:16
【问题描述】:
我正在尝试记录内存分配。我希望能够准确指定在运行时调用特定函数的函数调用(行号和文件名)。比如:
// overloading operator new
void* operator new [](std::size_t const count) {
void* p = std::malloc(count);
if (!p) throw std::bad_alloc{};
std::cout << "Allocated " << count << " bytes in file '"
<< CALLING_FUNCTION_FILE_NAME << "'. Line "
<< CALLING_FUNCTION_LINE_NUMBER << '.\n';
return p;
}
所以以后当我这样称呼它时:
// File sourceFileFoo.cpp
void foo() { // line 41
int* ip = new int[10]; // line 42
delete[] ip; // line 43
} // line 44
输出应该是这样的:
Allocated 40 bytes in file 'sourceFileFoo.cpp'. Line 42.
CALLING_FUNCTION_FILE_NAME 扩展为调用 operator new 的文件的名称 (sourceFileFoo.cpp),CALLING_FUNCTION_LINE_NUMBER 扩展为调用 operator new 的行 (42)。
- 我知道如果可能的话,这将是特定于实现的。我正在使用 Visual Studio 和 C++17。
- 我不能定义一个宏
NEW,它先进行日志记录,然后再进行分配。
【问题讨论】:
-
您使用的是哪个 C++ 版本?
-
boost.stacktrace 可能值得一看。尽管据我回忆,所提供信息的“质量”可能高度依赖于平台/编译标志等。
-
@NutCracker C++17。编辑标签
标签: c++ visual-studio logging c++17 visual-studio-2019