簡體   English   中英

使用-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 out_of_range異常未捕獲在catch塊中。 輸出是

terminate called after throwing an instance of 'std::out_of_range'
  what():  Out of range.
Abort trap

如果使用GCC編譯不帶-O2或-O3的示例,則一切正常

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端口集合)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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM