C++11 Visual Studio C++;未捕获的例外情况 使用VS2013,在C++代码下面,当访问具有超出范围索引的向量时,得到调试断言,这是OK(但未达到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; } #包括 #包括 #包括 使用名称空间std; 向量; void GetException() 试一试{ 整数和{0}; //访问向量末尾以外的元素 对于(int i=0;i

C++11 Visual Studio C++;未捕获的例外情况 使用VS2013,在C++代码下面,当访问具有超出范围索引的向量时,得到调试断言,这是OK(但未达到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; } #包括 #包括 #包括 使用名称空间std; 向量; void GetException() 试一试{ 整数和{0}; //访问向量末尾以外的元素 对于(int i=0;i,c++11,visual-studio-2013,exception-handling,C++11,Visual Studio 2013,Exception Handling,这个表达式Vector[i](在您的第一个代码示例中)不抛出异常(在正常的版本中,无论如何),如果i超出范围,这只是未定义的行为 如果i超出范围,则此表达式Vector.at(i)会抛出异常(在正常版本中) 如果您想让std::vector为您执行边界检查,并在访问超出边界时抛出异常,那么您应该使用该表单。如果vector[i]访问超出边界,则无法捕获问题。此表达式vector[i](在您的第一个代码示例中)不抛出异常(无论如何,在正常的发布版本中),如果i超出范围,这只是未定义的行为 如果i超

这个表达式
Vector[i]
(在您的第一个代码示例中)不抛出异常(在正常的版本中,无论如何),如果
i
超出范围,这只是未定义的行为


如果
i
超出范围,则此表达式
Vector.at(i)
会抛出异常(在正常版本中)


如果您想让
std::vector
为您执行边界检查,并在访问超出边界时抛出异常,那么您应该使用该表单。如果
vector[i]
访问超出边界,则无法
捕获问题。

此表达式
vector[i]
(在您的第一个代码示例中)不抛出异常(无论如何,在正常的发布版本中),如果
i
超出范围,这只是未定义的行为


如果
i
超出范围,则此表达式
Vector.at(i)
会抛出异常(在正常版本中)


如果您想让
std::vector
为您执行边界检查,并在访问超出边界时抛出异常,那么您应该使用该表单。如果
vector[i]出现问题,您就无法
捕获问题
访问权限超出限制。

您从迭代器调试功能获得此诊断。它不会使用异常来告诉您错误,捕获异常从未修复过错误。您必须修复代码。请转到运算符[]并阅读,然后转到at()。您会发现您想要使用at()如果您希望在元素索引超出范围时抛出异常。@Hans:当然,错误必须得到修复,但捕获异常可以向用户显示一条适当的错误消息,帮助开发人员找到错误,然后用户可以继续工作(大部分是这样的)。程序崩溃对任何人都没有帮助…这没有多大意义,您的用户将永远看不到这一点,因为您将部署优化的发布版本,即未启用迭代器调试功能的版本。更重要的是,它会使代码非常慢。该功能仅用于您的利益,并且仅用于修复错误。您正在获得此功能来自迭代器调试功能的gnostic。它不会使用异常来告诉您错误,捕获异常从未修复过错误。您必须改为修复代码。请转到并阅读运算符[],然后转到at()。您会发现您想要使用at()如果您希望在元素索引超出范围时抛出异常。@Hans:当然,错误必须得到修复,但捕获异常可以向用户显示一条适当的错误消息,帮助开发人员找到错误,然后用户可以继续工作(大部分是这样的)。程序崩溃对任何人都没有帮助…这没有多大意义,您的用户将永远看不到这一点,因为您将部署优化的发布版本,即未启用迭代器调试功能的版本。更重要的是,它会使代码非常慢。该功能仅用于您的利益,并且仅用于修复错误。
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;
}