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