在调试版本中使用其泄漏检查设备时,Microsoft有一个几十年前的错误。使用C ++类型信息(如typeinfo.name()
)时,运行时库的分配会报告泄漏。另请参阅Microsoft Connect上的Memory leaks reported by debug CRT inside typeinfo.name()。
由于大约相同的时间泄漏,我们一直在收到错误报告和用户列表讨论。 Microsoft错误还可以掩盖用户程序的实际泄漏。后一点对我来说尤其令人担忧,因为我们可能不会因为掩盖而倾向于出现真正的问题。
由于使用typeid(T)
和typeinfo.name()
,我想尝试压缩泄漏。我的问题是,我们如何解决微软的问题?有可用的工作吗?
答案 0 :(得分:1)
根据我在Q评论中提出的建议。
对于if (valueType == typeid(int))
,您可以使用type_index
(至少从C ++ 11开始)
type_info.name()
泄漏记忆:
由于完全消除泄漏似乎是不可能的,下一个最好的事情是减少它们的数量(每种类型的询问只减少一次),并且次要地,为了报告目的而标记它们。
在一些模板化的类中,人们可以希望“mem leaking”报告将使用类名(或者至少是发生分配的源文件) - 你可以随后使用这些信息将它们从“所有泄露的记忆”报告。
因此,您不必使用typeid(<typename>)
,而是使用以下内容:
“file typeid_name_workaround.hpp”
template <typename T> struct get_type_name {
static const char* name() const {
static const char* ret=typeid(T).name();
return ret;
}
};
其他.cpp/.hpp
档案
#include "typeid_name_workaround.hpp"
struct dummy {
};
int main() {
// instead of typeid(dummy).name() you use
get_type_name<dummy>::name();
}