Closed5

GLIBCXX_DEBUG が捕捉できないエラーがある?

log5log5
#define _GLIBCXX_DEBUG
#include <iostream>
using namespace std;
int main(void){
    string s = "abc";
    s[1] = s[3];
    return 0;
}

https://paiza.io/projects/dXj161-wWuMdz7rolco2ZA
これ exit 0 で成功してしまうのだけど、s[3] は境界外なので普通ならエラーの事案だと思った。
.at() を使うとエラーになる。

#include <iostream>
using namespace std;
int main(void){
    string s = "abc";
    s.at(1) = s.at(3);
    return 0;
}
terminate called after throwing an instance of 'std::out_of_range'
  what():  basic_string::at: __n (which is 3) >= this->size() (which is 3)

https://paiza.io/projects/upMgU6H2URkLwMKc33boYA?language=cpp

yohhoyyohhoy

FYI: C++標準ライブラリの文字列クラスstd::stringでは、s[s.size()]'\0'を返すと保証されていますね。つまりs1[1] = s1[3];後はs == {'a', '\0', 'c', '\0'} (size=3) となります。
これは、NUL文字('\0')終端されるC文字列への変換を容易にする措置(の副作用)でそうなっています。

log5log5

ありがとうございます!勉強になりました

このスクラップは2021/06/27にクローズされました