如何修复Microsoft typeinfo.name()内存泄漏?

时间:2016-10-14 03:00:19

标签: c++ visual-studio visual-c++ memory-leaks typeinfo

在调试版本中使用其泄漏检查设备时,Microsoft有一个几十年前的错误。使用C ++类型信息(如typeinfo.name())时,运行时库的分配会报告泄漏。另请参阅Microsoft Connect上的Memory leaks reported by debug CRT inside typeinfo.name()

由于大约相同的时间泄漏,我们一直在收到错误报告和用户列表讨论。 Microsoft错误还可以掩盖用户程序的实际泄漏。后一点对我来说尤其令人担忧,因为我们可能不会因为掩盖而倾向于出现真正的问题。

由于使用typeid(T)typeinfo.name(),我想尝试压缩泄漏。我的问题是,我们如何解决微软的问题?有可用的工作吗?

1 个答案:

答案 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();
}