gpt4 book ai didi

c++ - 使用 -O2 或 -O3 标志编译时未捕获异常

转载 作者:太空宇宙 更新时间:2023-11-04 12:55:17 26 4
gpt4 key购买 nike

我在使用带有 -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 未在 catch block 中捕获。输出是

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

关于c++ - 使用 -O2 或 -O3 标志编译时未捕获异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46959868/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com