【问题标题】:STL exceptions are not thrown Visual Studio 2015 Community Edition不抛出 STL 异常 Visual Studio 2015 Community Edition
【发布时间】:2018-05-05 14:36:31
【问题描述】:

这段代码肯定会抛出“向量下标超出范围”异常并弹出对话框。 但绝对没有任何反应。

std::vector<int> x;
for (int i = 0; i < 4; ++i)
    x.pop_back();

我尝试通过Debug-&gt;Windows-&gt;Exception Settings 启用 C++ 异常,但没有帮助...

这是什么原因造成的??

为什么在 Visual Studio 2015 中禁用异常?

编辑: 我的问题保持不变,但对于这段代码:

std::vector<int> x;
std::cout << x.at(3) << '\n';

编辑 2 完整代码:

#include <iostream>
#include <vector>

int main()
{
    std::vector<int> x;
    x.at(3) = 123;
    return 0;
}

什么都没扔,但reference 说应该扔

【问题讨论】:

  • 看不到 pop_back() 应该扔任何东西。参考资料说“例外:(无)”。
  • 并且this 明确指出,如果向量为空,则会导致 UB。
  • at(3) 为我抛出异常。你能发布不抛出的整个代码吗?
  • @ampawd 您还没有在代码中添加 try/catch 块。你确定这是你正在执行的代码吗?在假定的无效访问之前添加打印语句以确保。
  • “那个运行时对话框”是一个关于抛出异常的C++程序和Windows交互的问题。要查看是否抛出异常,请捕获它。一旦您确定抛出了异常,您就可以尝试找出为什么 Windows 运行时机制没有告诉您发生了这种情况。

标签: c++ visual-studio exception


【解决方案1】:

为什么pop_back一定要抛出异常?

在空容器上调用 pop_back 是未定义的。

所以这是一个未定义的行为。当然不用扔。

【讨论】:

    【解决方案2】:

    C++快速是要付出代价的,这意味着并非所有内容都可以在运行时检查。特别是在循环中检查每次访问都会减慢速度。

    您可以使用库的 debug 版本(如果编译器支持它们),这些版本应该会抱怨访问不正确。否则,一些编译器支持内存检查标志以在编译时检测越界访问。

    您可以(我建议应该)使用assert()(或类似的)检查边界,它只检查调试版本并且在发布版本中成本为零。

    【讨论】:

      【解决方案3】:

      项目正在使用不同的运行时库进行链接。

      解决方案: C/C++ -> 代码生成-> 运行库:改为多线程调试(/MTd)

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2017-11-01
        • 1970-01-01
        • 1970-01-01
        • 2017-11-21
        • 2016-10-05
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多