【问题标题】:Visual Studio debug iteratorsVisual Studio 调试迭代器
【发布时间】:2011-05-23 21:32:33
【问题描述】:

_SECURE_SCL_HAS_ITERATOR_DEBUGGING 之间是什么关系。 是否可以打开/关闭范围检查并保持二进制兼容性?

2008 版和 2010 版有什么区别吗?

【问题讨论】:

  • 第 9 频道的 Stephen T. Lavavej 不久前做了一个关于这个的演讲。不确定它是否回答了您的问题,但它可能对您来说仍然很有趣。 channel9.msdn.com/Shows/Going+Deep/…
  • @Benjamin:这是在阅读 _SECURE_STL 和 _HAS_ITERATOR_DEBUGGING 之后直接想到的。 :)

标签: c++ visual-studio


【解决方案1】:

Stephan Lavavej 提供了有关此_SECURE_SCL_HAS_ITERATOR_DEBUGGING 的一些详细信息:

来自http://blogs.msdn.com/b/vcblog/archive/2007/08/10/the-future-of-the-c-language.aspx

迭代器调试,由 _HAS_ITERATOR_DEBUGGING,执行强大的正确性验证。 迭代器检查,由 _SECURE_SCL,执行最少的检查,作为最后一道安全线 防御。例如,_SECURE_SCL 将终止触发的程序 带有向量迭代器的堆溢出。

MSDN 解释的所有内容 文档。这背后的故事 很有趣。这 _HAS_ITERATOR_DEBUGGING 功能由 Dinkumware 提供, 许可他们最多的公司 胜利实施 包含在标准库中 视觉工作室。 _SECURE_SCL 功能由微软添加, 为了提高安全性 在 Windows 上运行的程序。为了 执行他们的检查,两者 _HAS_ITERATOR_DEBUGGING 和 _SECURE_SCL 使迭代器包含额外的数据成员,例如 指向其父容器的指针。 _HAS_ITERATOR_DEBUGGING,因为它在调试模式下默认启用(并且 在发布模式下无法获得),也 构建允许的单链表 容器来指代他们的所有 迭代器。这个很贵 性能方面,但性能是 在调试模式下并不重要,这 可以进行出色的检查。

_SECURE_SCL,因为在发布模式下默认开启,力求做到 施加最小的性能惩罚。 因此,当它启用时, 尽管迭代器有返回指针 到他们的容器,容器不 有指向它们的迭代器的指针。 (更新“迭代器列表”也是 释放模式耗时。)

请注意,从 VS 2010 开始,_SECURE_SCL 在发布模式下默认不再启用(以上摘录来自 2007 年)。

如本错误报告 (http://connect.microsoft.com/VisualStudio/feedback/details/334315/has-iterator-debugging-0-causes-crash) 中所述,_SECURE_SCL_HAS_ITERATOR_DEBUGGING 都会影响 ABI:

_SECURE_SCL 和 _HAS_ITERATOR_DEBUGGING 显着改变了行为和 STL 容器的表示和 迭代器。 VC9 (Visual Studio 2008) 做了STL的表示 容器和迭代器更多 强烈依赖 _SECURE_SCL 和 _HAS_ITERATOR_DEBUGGING(这样做是为了修复一致性错误)。

因为这些宏改变了 STL 对象的表示,你 时必须遵守一定的规则 将这些宏从它们的 默认值。我在这里描述了规则: http://blogs.msdn.com/vcblog/archive/2007/08/10/the-future-of-the-c-language.aspx#4617984 总而言之,宏必须是 每个二进制文件(EXE 或 DLL),此外,二进制文件 必须互相传递 STL 对象 具有一致的宏设置。您的 示例涉及一个 EXE 和 DLL 在之间传递一个向量 自己,所以EXE和DLL需要 具有相同的 _SECURE_SCL 和 _HAS_ITERATOR_DEBUGGING 设置。

这些规则适用于 VC8、VC9 和所有 未来的版本。你的代码碰巧 使用 VC8 (Visual Studio 2005), 但如果做得更多就会失败 复杂的事情。

【讨论】:

  • 可能在VS2010新增的_ITERATOR_DEBUGLEVEL上加个说明。
  • 仅供以后遇到此答案的任何人参考:如前所述,在 VS2010 中,检查的迭代器在发布模式下被禁用,但在 VS2012 中它们再次启用,在 VS2013 中再次禁用。不知道为什么会有明显的复杂情绪。
猜你喜欢
  • 1970-01-01
  • 2015-08-04
  • 2010-09-18
  • 2023-01-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-08-20
相关资源
最近更新 更多