我有一个程序,在该程序中,部分用于信息日志记录,我在使用某些类时输出它们的名称(特别是我在日志中添加了一个条目,如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
成员函数返回一个以 null 结尾的字符串,表示该const char*
类型的人类可读名称。指向的内存是缓存的,永远不应该直接释放。
但是,当我在调试器中退出程序时,任何“新”使用都会typeinfo::name()
显示为内存泄漏。如果我输出 2 个类的信息,我会得到 2 个内存泄漏,依此类推。这暗示缓存的数据永远不会被释放。
虽然这不是一个主要问题,但它看起来很混乱,并且经过长时间的调试会话后,它很容易隐藏真正的内存泄漏。
我环顾四周,发现了一些有用的信息(一个 SO 答案提供了一些关于如何实现 typeinfo 的有趣信息),但我想知道这个内存是否应该由系统正常释放,或者是否有什么我可以做的调试时“不注意”泄漏。
我确实有一个后备计划,即getMessageName
自己编写方法而不是依赖于typeinfo::name
,但无论如何我想知道是否有我错过的东西。