実験:空のstd::vectorから要素を取得するとどうなるか?

ふとした疑問

std::vectorには最後尾の要素を取得するbackというメソッドがあります。 もし、vectorが空の場合backメソッドを呼ぶとどうなるのか実験してみました。

書いたコードはこんな感じ。期待する動作は空要素を返すか、何らかの例外を投げてくれるか。

#include <vector>
#include <string>
#include <iostream>
int main(int argc, char* argv[])
{
    std::vector<std::string> StrList;

    try {
            auto v = StrList.back();
        std::cout  << "Length = " << v.length() << std::endl;
    } catch (std::exception& e) {
       std::cout  << "exception:" << e.what()  << std::endl;
    }

    return 0;
}

実験結果

試したのはbcc32c 7.40、MS-C 19.16.27026.1 、gcc 7.3.0、clang 6.0.0。gccとclangはWSLで確認。 結果は以下の通り。

コンパイラ 結果
bcc32c 例外やエラーなし。
MS-C 例外やエラーなし。
gcc segmentation fault
clang segmentation fault

Windows処理系だと、例外すら発生せずにどこかでコケている感じ。 bcc32cはデバッガで確認したり、Dinkumware STLのソースを確認すると、単に「end() - 1」だったので、そりゃあコケるわなと。

まとめのようなモノ

ということで、コンテナから要素を取り出す場合emptyとかでチェックしないと駄目というオチでした。