仅在调试模式下发生异常

Exception occurs only in debug mode

提问人:Hồ Thiên Phúc 提问时间:8/31/2023 更新时间:8/31/2023 访问量:65

问:

我正在通过Visual Studio 2015 Pro更新2开发C++项目。

我的示例代码如下:

我的课堂.h

class MyClass
{
    vector<int> vectorBig;
    ...
    Constructor declare
}

MyClass.cpp

MyClass::MyClass(),
vectorBig(0)
{
}

void TestMethod()
{
     int a = *max_element(vectorBig.begin(), vectorBig.end());
}

当我运行应用程序时,max_element进程中发生异常。 但是,它只发生在调试模式下,而不是在发布模式下。

我不知道为什么。 请帮帮我。

谢谢

我可以知道为什么异常只发生在 Debug mod 中

C++ 异常 调试

评论

2赞 UnholySheep 8/31/2023
如果向量为空,则返回 Because 。取消引用迭代器是未定义的行为std::max_elementvectorBig.end()end
5赞 paddy 8/31/2023
Visual Studio 在调试版本中启用已检验的迭代器,这有助于捕获此类错误。这可能就是你得到一个例外的原因。
4赞 Pepijn Kramer 8/31/2023
旁注:也停止使用。请参阅此 C++ 每周一集,了解如何停止使用命名空间 std;using namespace std;

答:

0赞 shaked cohen 8/31/2023 #1

我想详细说明一下其他评论提到的内容。
调试与发布 - 模式旨在帮助我们(开发人员)发现程序中的错误。变量未优化,边界未检查,类未内联,调试断言未计算等。这将使我们作为开发人员的生活更轻松的事情。包括一个重要功能 - 迭代器验证。如果取消引用从标准库容器接收的调用中获得的迭代器,它将引发异常并导致程序崩溃。这将帮助你找到错误,因为你永远不会被允许这样做,如果你这样做,你的程序总是会崩溃,所以你可以找到你犯了错误的地方以及如何犯错。
但这是有代价的——一切都变慢了。慢得多。
版本是将到达生产环境和客户环境的版本。这些需要尽可能快。因此,所有这些额外的检查都被扔出了窗外。对于迭代器,在取消引用迭代器时不会引发异常,而是未定义程序的行为。会发生一些事情。也许这是你的意思,也许不是。它可能会崩溃,因为您试图读取不允许读取的内存(在这种情况下,是操作系统杀死了您的程序),也许它会带来一些垃圾数据。

现在,对于手头的问题。就像其他人提到的,如果输入 to 是一个空向量,它将返回对输入向量的调用结果。 取消引用,这是未定义的行为。
在调试中,你会得到训练轮,并引发异常。在发布中,您会得到未定义的行为。
我鼓励您阅读有关两者的信息,这是一个很棒的网站。
debugend()releaseend()max_elementend()max_elementstd::vector::endcppreference