之间是什么关系_SECURE_SCL和_HAS_ITERATOR_DEBUGGING.是否可以打开/关闭范围检查并保持二进制兼容性?
2008和2010版本之间有什么区别?
斯蒂芬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提供,该公司授权其最高级的标准库实现包含在Visual Studio中.Microsoft已添加_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)一起使用,但如果它执行更复杂的操作则会失败.
| 归档时间: |
|
| 查看次数: |
6809 次 |
| 最近记录: |