У меня есть программа, в которой, отчасти для информационного протоколирования, я вывожу имена некоторых классов по мере их использования (в частности, я добавляю в журнал запись следующего содержания: Сообщения::CSomeClass переданы на 127.0.0.1
). Я делаю это с помощью кода, подобного следующему:
std::string getMessageName(void) const {
return std::string(typeid(*this).name());
}
И да, пока никто не указал на это, я понимаю, что вывод typeinfo::name
зависит от реализации.
Согласно MSDN
Функция-член
type_info::name
возвращаетconst char*
в нуль-терминированную строку, представляющую человекочитаемое имя типа. Память, на которую указывается, кэшируется и никогда не должна быть непосредственно деаллоцирована.
Однако, когда я выхожу из своей программы в отладчике, любое "новое" использование typeinfo::name()
проявляется как утечка памяти. Если я вывожу информацию для двух классов, я получаю две утечки памяти, и так далее. Это намекает на то, что кэшированные данные никогда не освобождаются.
Хотя это и не является серьезной проблемой, это выглядит грязно, и после длительной отладки это может легко скрыть настоящие утечки памяти.
Я осмотрелся и нашел немного полезной информации (один из ответов SO дает интересную информацию о том, как может быть реализована typeinfo), но мне интересно, должна ли эта память обычно освобождаться системой, или есть ли что-то, что я могу сделать, чтобы "не заметить" утечки при отладке.
У меня есть запасной план - написать метод getMessageName
самостоятельно и не полагаться на typeinfo::name
, но я все равно хотел бы знать, может быть, я что-то упустил.