質問: C++のSTLって不安定なんですか?? 以前、std::cout を使っていて文字化けを起こしたので std::printf()を使ったところ、文字化けが解消されました。 boostにformatがありますよね。 printfの書式指定が使えるので、以前は使っていたのですが・・・ ``` #include #include int main() { std::cout << boost::format("%2% %1%") % 3 % std::string("Hello") << std::endl; return 0; } ``` これも文字化けを起こす時があって、安定して使えないという理由で今は使っていません。 ベタ貼り状態の文字列の時だけ、std::cout を使っています。 他にも、昨日バックトラック法を使ったアルゴリズムのプログラムを作成していたのですが、ちょっと変更を加えただけでセグメンテーションフォルトが起きて困っていました。 GDBで追ってみても、原因がわからず、printfデバッグを使って原因を突き止めたら・・・ ``` std::string data; std::getline(std::cin, data); ``` の部分でセグメンテーションフォルトを起こしていました。 もぉ・・・何がなんだか・・・ 以下のようなものを見つけました。 Linus TorvaldsのC++批判は正しかったのか > > STLやBoostを潜在的に不安定で非効率にした原因がC++だと考える開発者も多い。 > > > やはり、C++ STLって一般的に「不安定」と言われているものなのでしょうか?? あまり、STLを使わない方が良いんでしょうか? C++ STLを使うときの注意点や不安定性の回避方法などがあったら教えてください。 やはり、 C言語の関数が良い感じがしますね。 あ、コンパイラはgcc g++ を利用しています。
回答: 「不安定」ではないが、こちらの事情を考慮する「親切心」はないですね coutの初期化順によるバグなんて coutの<<オペレータ初回呼び出し時にcout初期化してくれりゃ済む話なんですが C++はそういう事をプログラマに任せる言語なんです。 文字化けについて心当たりは ``` #include #include int main(void) { using namespace std::string_literals; auto h = "hoge\0hage"s; std::cout << h.c_str() << std::endl; std::cout << h << std::endl; std::cout << h.size() << std::endl; } ``` 結果は ``` hoge hogehage 9 ``` と、なります。 SEGVについてはロケールがどうなってるか気になりますね。 `locale::global(locale(""));`をmain関数頭あたりで実行してみてはどうでしょう。