如何使std :: vector的operator []编译在DEBUG中进行边界检查,但不在RELEASE中进行

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

  • 为什么libstdc ++宏会在Visual Studio中运行?你不是指C++标准库吗? (2认同)