【问题标题】:Defining _CRT_SECURE_NO_WARNINGS lead to crash in vector destructor定义 _CRT_SECURE_NO_WARNINGS 导致向量析构函数崩溃
【发布时间】:2011-08-19 11:08:44
【问题描述】:

我正在处理从 Visual C++ 6.0 移植到 VC++ 9.0 (2008) 的遗留代码。我使用 _CRT_SECURE_NO_WARNINGS 预处理器定义禁用了安全 CRT 警告。但这导致了 std::vector 析构函数的崩溃。

使用_CRT_SECURE_NO_WARNINGS有什么问题吗?

【问题讨论】:

  • 堆损坏不需要预处理器定义来字节你。

标签: c++ visual-c++ stl visual-c++-6 msvcrt


【解决方案1】:

它是如何崩溃的?这听起来更像是你在一个位置有内存覆盖你的向量中的内存,然后在你的向量被释放之前释放它。我会寻找任何有指针的地方。由于您现在使用的是符合标准的编译器,因此将它们替换为 boost 共享指针或 boost 数组。在迭代器使用起来更安全的情况下,无需使用指针算法。

【讨论】:

  • 我不能过多地使用 boost/change 代码,因为代码是由第三方编写和许可的。
  • VC++ 6.0 的问题在于它是一个不符合标准的编译器。当你从一个移植到另一个时,你会遇到问题。此外,如果您尝试从 VS2008 调用 VC++ 6.0 编译的 dll 或 lib,您可能会打开潘多拉魔盒而遇到麻烦。只需充实并删除尽可能多的指针区域即可。可能是旧代码是错误的,只是碰巧到现在才起作用。这就是有时内存问题的工作原理......
  • @sarat:那么问题出在哪里?
【解决方案2】:

这些是不相关的问题。 _CRT_SECURE_NO_WARNINGS 仅抑制弃用警告,不会改变程序行为。您必须调试实际问题。

【讨论】:

    【解决方案3】:

    您绝对是需要快速而肮脏的解决方案以“让它发挥作用”的人之一。不好的做法。不要定义隐藏警告的指令,而是在您的代码中启用所有警告(级别 4 - /W4)并努力删除所有警告。通过消除由它们引起的所有可能的警告和副作用,使您的代码更加健壮。

    VC6 和最新的 VC 编译器之间存在巨大差异 - 在 VC6 中完美运行的东西现在可能无法运行,这不是最新编译器的错,而是您的代码的错。编译器/调试器有助于及早发现缺陷(在开发/调试阶段)。

    我还建议你运行一些静态分析(如果你有的话,比如在更高版本的 Visual Studio 中使用/analyze 开关进行代码分析)。您还应该对代码运行动态代码分析以发现更多问题。

    【讨论】:

      猜你喜欢
      • 2011-06-12
      • 1970-01-01
      • 2013-04-13
      • 2015-12-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-10-07
      • 2018-07-01
      相关资源
      最近更新 更多