1
-O2 또는 -O3 플래그가있는 GCC를 사용하여 아래 예제를 컴파일 할 때 문제가 발생했습니다. -O2 또는 -O3 플래그로 컴파일 할 때 예외가 catch되지 않습니다.
#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;
}
의 예는 -03 플래그로 컴파일 할 때
g++ -std=c++11 -Wall -pedantic -Wextra -O3 -g0 -o args args.cpp
예외 std::out_of_range
는 캐치 BLOK에서 잡은되지 않습니다. (FreeBSD 포트 컬렉션) : 출력의 예는 -O2 또는 -O3
g++ -std=c++11 -Wall -pedantic -Wextra -g0 -o args args.cpp
없이 또는 그 소리
GCC의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로 컴파일 된 경우
terminate called after throwing an instance of 'std::out_of_range'
what(): Out of range.
Abort trap
모든 작품입니다 5.4.0
CLang 버전 : 4.0.0
OS : FreeBSD 11.1 (amd64)
버그는 어디에 있습니까?
"버그는 어디에 있습니까?": freebsd. 귀하의 질문 제목에서, 당신의 시스템이 무엇인지 추측했습니다 ... –