У меня есть программа, в которой, отчасти для информационного логирования, я вывожу имена некоторых классов по мере их использования (конкретно я добавляю в лог запись типа Messages::CSomeClass transmitted to 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()
проявляется как утечка памяти. Если я вывожу информацию для 2 классов, я получаю 2 утечки памяти и так далее. Это намекает на то, что кэшированные данные никогда не освобождаются.
Хотя это не является серьезной проблемой, она выглядит беспорядочно, и после долгого сеанса отладки она может легко скрыть подлинные утечки памяти.
Я осмотрелся и нашел некоторую полезную информацию (один ответ SO дает некоторую интересную информацию о как может быть реализована typeinfo), но Мне интересно, должна ли эта память обычно освобождаться системой, или я могу что-то сделать, чтобы «не замечать» утечки при отладке.
У меня есть запасной план, заключающийся в том, чтобы самому запрограммировать метод getMessageName
и не полагаться на typeinfo::name
, но я все равно хотел бы знать, не пропустил ли я что-то.