【问题标题】:How to remediate Microsoft typeinfo.name() memory leaks?如何修复 Microsoft typeinfo.name() 内存泄漏?
【发布时间】:2016-10-14 03:00:18
【问题描述】:

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

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

我想尝试消除由于使用typeid(T)typeinfo.name() 而导致的泄漏。我的问题是,我们如何才能解决微软的错误?有解决办法吗?

【问题讨论】:

  • 不要使用typeinfo.name()?
  • 谢谢山姆。我在licensing the source code 上找不到任何信息。你有链接吗?此外,在这种情况下修复如何工作?是否希望所有用户都获得许可?或者我们是否通过.local DLL 重定向的并行链接进行许可和分发?后者似乎不是一个可行的选择,但我想确保我理解这个过程。
  • 建议:重新访问您正在使用的所有地方 typeinfo.name() 并将调用替换为将调用定向到某些 Meyer 的单例函数或模板之类的东西 - 至少,会有有限数量的 '静态变量泄漏。
  • 谢谢阿德里安。这对我们来说并不容易。我们基本上有调用typeid(T) 的序列化代码,并执行if (valueType == typeid(int)) 之类的操作。它仅限于两个或三个源文件,但它经常以不同的类型调用。如果我正确解析了建议,我们会将泄漏移到 Singleton 中。
  • @jww “如果我正确解析了建议,我们会将泄漏移到单例中。” 是的,这是我的建议。您要求解决方法。

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


【解决方案1】:

关于我在 Q 的 cmets 中的建议。

对于if (valueType == typeid(int)),您可以使用type_index(至少从 C++11 开始)


对于type_info.name()内存泄漏:

由于完全消除泄漏似乎是不可能的,下一个最好的办法是减少它们的数量(每个类型询问只泄漏一个),其次,标记它们以用于报告目的。
在某些模板类中,人们可以希望“内存泄漏”报告将使用类名(或至少是发生分配的源文件) - 随后您可以使用此信息将它们从“所有泄漏内存的报告。

所以不要使用typeid(<typename>),而是使用类似的东西:

“文件类型id_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();
}

【讨论】:

  • 谢谢阿德里安。那效果不好。报告的内存泄漏数量从 32 次增加到 40 次。我猜临时人员让事情变得更糟。不过,感谢您的建议。
  • 哦,好吧,我能说什么?我只能忍受 32 个“甚至不正确的泄漏”(它们的数量不会随着时间的推移而增加)。是的,我可以看到它们被称为泄漏,因为在退出程序之前您无法释放内存;但请注意not everyone agrees the memory has to be freed before exiting(...一个 MSDN 博客条目,您是否感到惊讶?我认为这应该告诉您在修复该错误之前不要屏住呼吸)。干杯。
  • 谢谢阿德里安。是的,我以前见过“它不是泄漏”的位置。我认为只要不影响他人或测试结果就可以了。但在这种情况下,它会通过干扰测试和隐藏泄漏来影响非 MS 代码,因此它可能是一个安全漏洞。此外,如果代码用于库(如 DLL)中,当从 Java 和 .Net 等托管语言调用时,内存泄漏可能会无限增长。 Java 和 .Net 将多次加载和卸载 DLL。
猜你喜欢
  • 1970-01-01
  • 2012-01-12
  • 2018-05-09
  • 2018-07-12
  • 2012-09-14
  • 2020-05-24
  • 2011-05-25
相关资源
最近更新 更多