Я предполагаю, что вы учитываете только объекты в куче. В этом случае вы можете регистрировать все вызовы новых и удалять, заменяя их некоторыми пользовательскими макросами.
Мы разработали такую специальную систему регистрации. Основная цель состояла в том, чтобы отследить утечки памяти, но ее также можно использовать для определения количества объектов в любой конкретный момент времени. Например,
#define MY_NEW_OBJECT(a, T) \
a = new T; \
MY_LOGGING((LM_DEBUG, "[NEW OBJ ] 0x%08X(%s), %4d bytes. %-20s - %-40s - %4d\n", a, #T, \
sizeof(T), __FILE__, __func__, __LINE__));
MyClass* myObj;
MY_NEW_OBJECT(myObj, MyClass);
MY_LOGGING автоматически добавляет метку времени в начале каждой строки. Строка содержит имя класса, имя файла, номер строки, имя функции и размер.
Утилита анализирует файл журнала и генерирует графики, показывающие количество объектов, общий использованный размер и т. Д. В любое время.
Конечно, вы должны заменять все новые / удалять вызовы макросами. Что может быть совсем немного работы.