C ++ try catch对于数组越界不起作用

时间:2019-02-22 11:45:21

标签: c++ exception-handling

我们有一个基于QT的c ++应用程序。我们也在其中使用第三方dll。但是,C ++的try and catch根本不起作用。

例如:

#include <QCoreApplication>
#include <QDebug>
#include <QException>

int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);

    int arr[10];
    try
    {
        arr[11] = 30;
    }
    catch (const std::out_of_range& e)
    {
        qDebug() << "Exception out of range occurred ..." << e.what();
    }
    catch (...)
    {
        qDebug() << "Unknown Exception occured...";
    }

    return a.exec();
}

以上是最小的示例。在上面,它使程序崩溃。 有办法解决吗?

3 个答案:

答案 0 :(得分:1)

读取或写入数组边界是未定义的行为。不能保证它会崩溃,引发异常或根本不执行任何操作。只是格式错误的代码。

如果您想通过边界检查数组式容器,则标准库中有std::arraystd::vector,甚至还有std::deque。它们都有一个at()成员函数,该函数会进行边界检查,并会抛出一个std::out_of_range异常。

答案 1 :(得分:0)

回答您的问题:

  

“ C ++ try catch对于第三方库不起作用”

不! C ++ try catch可以与第三方(Qt)库一起使用,如下例所示。

但是您显示的代码不是mcve。因此,很难说到底是什么导致了您所说的问题。

#include <QCoreApplication>
#include <QDebug>
#include <QException>

class testException : public QException
{
public:
    testException(QString const& message) :
        message(message)
    {}

    virtual ~testException()
    {}

    void raise() const { throw *this; }
    testException *clone() const { return new testException(*this); }

    QString getMessage() const {
        return message;
    }
private:
    QString message;
};

int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);

    try
    {
        // throw std::out_of_range("blah");
        throw testException("blah");
    }
    catch (const std::out_of_range& e)
    {
        qDebug() << "Exception out of range occurred ...";
    }
    catch (...)
    {
        qDebug() << "Unknown Exception occured...";
    }

    return a.exec();
}

答案 2 :(得分:0)

std::out_of_range

  

它可能由std::bitsetstd::basic_string的成员函数,std::stoistd::stod函数族以及由边界检查的成员访问函数抛出(例如std::vector::atstd::map::at

您的try块都没有这些内容。 undefined behaviour是对普通C样式数组的无限制访问。正如您所经历的那样,这通常表现为崩溃。