Visual Studio C ++异常未被捕获

时间:2016-03-08 14:29:46

标签: c++11 visual-studio-2013 exception-handling

使用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;
}

1 个答案:

答案 0 :(得分:2)

此表达式Vector[i](在您的第一个代码示例中)不会抛出异常(在正常情况下,无论如何都是发布版本),如果i超出范围,它就是未定义的行为。< / p>

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

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