実験:空の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とかでチェックしないと駄目というオチでした。