Edi*_*enz 25 c++ visual-studio-2008 bounds-checker
我正在使用Visual Studio 2008.
我知道std :: vector已经使用at()函数进行边界检查,并且如果您尝试使用operator []错误地访问某些内容(超出范围),则会有未定义的行为.
我很好奇是否可以使用边界检查来编译我的程序.这样,operator []将使用at()函数,并在某些事物超出范围时抛出std :: out_of_range.
将在没有边界检查operator []的情况下编译释放模式,因此性能不会降低.
我开始考虑这个问题,因为我正在将使用Borland C++编写的应用程序迁移到Visual Studio,并且在我的代码的一小部分中将其迁移(i = 0,j = 1):
v[i][j]; //v is a std::vector<std::vector<int> >
Run Code Online (Sandbox Code Playgroud)
向量'v'的大小为[0] [1](因此向量的元素0只有一个元素).这是未定义的行为,我知道,但是Borland在这里返回0,VS正在崩溃.我喜欢崩溃比返回0更好,所以如果我可以通过抛出std :: out_of_range异常得到更多'崩溃',迁移将更快完成(因此它会暴露更多Borland隐藏的错误).
jal*_*alf 28
Visual Studio 2005和2008年已经做边界检查在operator[]
默认情况下,在这两个调试和发布版本.
控制此行为的宏是_SECURE_SCL
.将其设置为0以禁用边界检查.
他们目前在VS2010中的计划是在发布版本中默认禁用边界检查,但在调试时保持打开状态.(宏也越来越重命名为_ITERATOR_DEBUG_LEVEL
.我不知道是否有它可用任何正式的文件还没有,但它已被提到这里和这里)
amo*_*mos 12
启用标志_GLIBCXX_DEBUG以对STL容器执行边界检查,如下所述:http: //gcc.gnu.org/onlinedocs/libstdc++/manual/debug_mode.html