使用VS2013,在下面的C ++代码中,当访问带有超出范围索引的向量时,我得到一个调试断言,这是正常的(但是没有达到catch块)。运行发行版时,程序运行时不会捕获异常。输出为1,而应为0.
#include <iostream>
#include <vector>
#include <stdexcept>
using namespace std;
vector<int> Vector;
void GetException()
try{
int Sum{ 0 };
// Access an element beyond the end of the vector
for( int i = 0; i <= Vector.size(); i++ )
Sum += Vector[i];
}
catch( ... ){
Vector.clear();
}
int _tmain(int argc, _TCHAR* argv[])
{
Vector.push_back( 1 );
GetException();
cout << Vector.size() << endl;
return 0;
}
当我更改它以访问nullptr时,我在调试版本中收到“未处理的异常”的错误消息,并且在发布版本中它在访问时崩溃。 VS中是否存在修改异常行为的参数?
int Sum{ 0 };
void GetException()
try{
int *pSum{ nullptr };
Sum = *pSum;
}
catch( ... ){
Sum = 1;
}
int _tmain(int argc, _TCHAR* argv[])
{
GetException();
cout << Sum << endl;
return 0;
}
答案 0 :(得分:2)
此表达式Vector[i]
(在您的第一个代码示例中)不会抛出异常(在正常情况下,无论如何都是发布版本),如果i
超出范围,它就是未定义的行为。< / p>
如果Vector.at(i)
超出范围,则此表达式i
会抛出异常(在正常的发布版本中)。
如果您想要为您进行std::vector
边界检查,并在访问超出范围时抛出异常,那么您应该使用该表单。如果catch
访问超出范围,则无法Vector[i]
问题。