使用 -O2 或 -O3 标志编译时未捕获异常
Exception not caught when compiled with -O2 or -O3 flag
我在使用 -O2 或 -O3 标志编译下面的 GCC 示例时遇到了问题。
#include <string>
#include <stdexcept>
#include <iostream>
class Args {
public:
Args(int, char** argv);
const std::string get_arg() const;
private:
int argc_;
int index_ = 0;
char** argv_;
};
Args::Args(int argc, char** argv):
argc_(argc),
argv_(argv)
{
}
const std::string Args::get_arg() const
{
if (index_ >= argc_) {
throw std::out_of_range("Out of range.");
}
return std::string(argv_[index_]);
}
int main(int, char** argv)
{
Args args(0, argv);
try {
std::string a = args.get_arg(); // Must throw.
std::cout << "After get_arg(): " << a << std::endl;
} catch(std::out_of_range) {
std::cout << "Catched" << std::endl;
}
return 0;
}
使用 -O3 标志编译示例时
g++ -std=c++11 -Wall -pedantic -Wextra -O3 -g0 -o args args.cpp
异常std::out_of_range
未在捕获块中捕获。输出为
terminate called after throwing an instance of 'std::out_of_range'
what(): Out of range.
Abort trap
如果示例使用没有 -O2 或 -O3 的 GCC 编译,则一切正常
g++ -std=c++11 -Wall -pedantic -Wextra -g0 -o args args.cpp
或与 CLang 一起
clang++ -std=c++11 -Wall -pedantic -Wextra -O3 -g0 -o args args.cpp
clang++ -std=c++11 -Wall -pedantic -Wextra -g0 -o args args.cpp
GCC 版本: (FreeBSD Ports Collection) 5.4.0
CLang版本:4.0.0
操作系统: FreeBSD 11.1 (amd64)
错误在哪里?
感谢您的导航。我在这篇文章中找到了正确的解决方案 https://stackoverflow.com/a/33279425/8838989。当示例使用标志编译时,它有效-Wl,-rpath=/usr/local/lib/gcc5
g++5 -std=c++11 -Wall -pedantic -Wextra -O3 -g0 -Wl,-rpath=/usr/local/lib/gcc5 -o args args.cpp
相关文章:
- 当类定义不可见时捕获异常
- 来自 Android 应用程序内部的 boost 类型的 boost::wrapexcept<boost::system::system_error> 的未捕获异常
- 如何通过 pybind11 从 python 中的C++中捕获异常?
- 信号后未捕获异常
- 捕获异常后如何退出程序执行
- C++ 捕获异常后进行清理的标准方法是什么?
- 使用模板类引发和捕获异常
- E/libc++abi:终止于类型为google::protobuf::FatalException的未捕获异常
- 如果在生成 std::thread 后引发,则未捕获异常
- C++ 未捕获异常,程序将终止并中止
- C++程序在第一次尝试时会给出垃圾,但如果它捕获异常并重试,则会给出适当的值
- 仅捕获异常就可以检测所有二进制文件在C 中读取错误是否足够
- 如何捕获 I/O 异常(确切地说是 I/O,而不是 std::exception)
- 为什么捕获异常播放允许尾括号
- throw() 函数应该总是在异常时展开堆栈并允许捕获异常还是必须调用 std::terminate ?
- 寻求与类型为 std::invalid_argument 的未捕获异常相关的运行时错误的建议: stoi:无转换
- 如何从调用函数中捕获异常
- 当用户在字符数组中输入整数值时捕获异常
- C++按值捕获异常时的示例是不好的
- 使用 -O2 或 -O3 标志编译时未捕获异常