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