Для обычного трекера памяти 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);
}
Вышеприведенное работает только в том случае, если у вас нет нового оператора, определенного в области видимости класса. Если у вас есть некоторые в области видимости класса, выполните:
#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