对于通用 C++ 内存跟踪器,您需要重载以下内容:
global operator new
global operator new []
global operator delete
global operator delete []
any class allocators
any in-place allocators
棘手的一点是获得有用的信息,重载的运算符只有分配器的大小信息和删除的内存指针。一种答案是使用宏。我知道。讨厌。一个示例 - 放置在所有源文件中包含的标头中:
#undef new
void *operator new (size_t size, char *file, int line, char *function);
// other operators
#define new new (__FILE__, __LINE__, __FUNCTION__)
并创建一个源文件:
void *operator new (size_t size, char *file, int line, char *function)
{
// add tracking code here...
return malloc (size);
}
仅当您没有在类范围内定义任何 operator new 时,上述内容才有效。如果您确实有一些在课堂范围内,请执行以下操作:
#define NEW new (__FILE__, __LINE__, __FUNCTION__)
并将“新类型”替换为“新类型”,但这可能需要更改大量代码。
由于它是一个宏,因此删除内存跟踪器非常简单,标题变为:
#if defined ENABLED_MEMORY_TRACKER
#undef new
void *operator new (size_t size, char *file, int line, char *function);
// other operators
#define NEW new (__FILE__, __LINE__, __FUNCTION__)
#else
#define NEW new
#endif
和实现文件:
#if defined ENABLED_MEMORY_TRACKER
void *operator new (size_t size, char *file, int line, char *function)
{
// add tracking code here...
return malloc (size);
}
endif