質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

Q&A

解決済

4回答

4863閲覧

C++STLって不安定なんでしょうか??

strike1217

総合スコア651

C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

0グッド

1クリップ

投稿2018/05/03 11:59

C++のSTLって不安定なんですか??

以前、std::cout を使っていて文字化けを起こしたので std::printf()を使ったところ、文字化けが解消されました。

boostにformatがありますよね。
printfの書式指定が使えるので、以前は使っていたのですが・・・

C++

1#include <iostream> 2#include <boost/format.hpp> 3 4int main() 5{ 6 std::cout << 7 boost::format("%2% %1%") % 3 % std::string("Hello") 8 << std::endl; 9 return 0; 10}

これも文字化けを起こす時があって、安定して使えないという理由で今は使っていません。
ベタ貼り状態の文字列の時だけ、std::cout を使っています。

他にも、昨日バックトラック法を使ったアルゴリズムのプログラムを作成していたのですが、ちょっと変更を加えただけでセグメンテーションフォルトが起きて困っていました。

GDBで追ってみても、原因がわからず、printfデバッグを使って原因を突き止めたら・・・

C++

1std::string data; 2std::getline(std::cin, data);

の部分でセグメンテーションフォルトを起こしていました。

もぉ・・・何がなんだか・・・

以下のようなものを見つけました。
Linus TorvaldsのC++批判は正しかったのか

STLやBoostを潜在的に不安定で非効率にした原因がC++だと考える開発者も多い。

やはり、C++ STLって一般的に「不安定」と言われているものなのでしょうか??

あまり、STLを使わない方が良いんでしょうか?

C++ STLを使うときの注意点や不安定性の回避方法などがあったら教えてください。

やはり、 C言語の関数が良い感じがしますね。

あ、コンパイラはgcc g++ を利用しています。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答4

0

ベストアンサー

こんにちは。

STLはそれなりに使ってますけど、不安定さが気になったことはないです。
落ちるはずないところで落ちたことも少しありますが、全て自分のバグでした。不正メモリアクセスしてポインタや参照を破壊してました。

std::coutでの文字化けは所謂全角文字を使っている時くらいですね。
他にはnull終端していないC言語文字列を渡してしまったとか、std::vectorの既に無効になったイテレータから表示していたとか、ある意味間抜けなバグばかりでした。

STLやBoostを潜在的に不安定で非効率にした原因がC++だと考える開発者も多い。

単にC++に習熟していないだけかと。
私もC++に習熟するに連れ、上記のようなバグを起こすことはなくなりました。一度悟れば同じバグを起こさないで済むコードを書きやすいのがC++の良いところと思います。
C言語では悟っても同じ不具合を起こさないコードは毎回それなりの量になってしまうのが辛いです。
std::stringとscanfやsnprintfの差が例として判りやすいと思います。

しかし、LinusさんのLinuxのカーネル開発にC++を使うべきでないととの主張は理解できます。
大勢のプログラマを使って高信頼性のプログラムを開発しないと行けない立場なら、習熟にC++程時間を要しない言語を使った方が多くの工数を投入できますし、習熟不足のプログラマの憂鬱を軽減できます。

投稿2018/05/03 13:15

Chironian

総合スコア23272

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

strike1217

2018/05/03 13:25

「STLはそれなりに使ってますけど、不安定さが気になったことはないです。」 左様でございますか!! やはり経験の差でしょうかね。 未だに原因がわからずじまいなので、少々困っているのですが・・・ STLが原因ではない・・・ということですよね。
Chironian

2018/05/03 14:46

その可能性の方が高いと思います。 STLはそれなりにテストされている筈ですし、実際に使っている人も凄まじい人数がいるでしょう。信頼性はかなり高い筈ですよ。 > 未だに原因がわからずじまいなので、少々困っているのですが・・・ 不正メモリ・アクセスは本当に頭痛いです。原因と結果の間に直接の関連がないから追いかけようがないですもんね。私はそのような時、ばっさりロジックを削って不具合が起きないところまで持っていき、次に少しづつロジックを足していくこともあります。本当に皆目検討もつかないときの最後の手段です。 でも、その前に、printf()デバッグ時、printf()する度にflush()してますか? flush()してないとキャッシュに残ったまま表示されないで落ちるので落ちた場所を見誤りますよ。
strike1217

2018/05/03 16:00

「std::coutでの文字化けは所謂全角文字を使っている時くらいですね。」 これって、std::cout で全角文字を出力しようとすると化けるんですか?
strike1217

2018/05/03 16:04

ちなみに、printfデバッグはfflushしてもダメでした。 再度作り直してしまったので、失敗作は削除してしまったのでコードが載せられないのですが・・・ 次同じような現象がでたら再度質問いたします。
Chironian

2018/05/03 17:18

> これって、std::cout で全角文字を出力しようとすると化けるんですか? ちょっと油断すると化けますし、場合によっては文字化けを回避するすべが無い時もあります。 全てWindowsのShift-JISが悪いのです。Unicodeに統一して欲しいものです。
strike1217

2018/05/04 04:07

もしかして、文字化けの原因はそれかもしれないです。 とりあえず、安心してSTLを利用できるということがわかりましたので、BAにさせてもらいます。
guest

0

C++のSTLって不安定なんですか??

そんなことはありません。C++による商用アプリの開発でも広く使われています(というかそれなしには無理)。あなたが感じるほど不安定な代物なら、誰も使いたがりませんよ。

これも文字化けを起こす時があって、安定して使えないという理由で今は使っていません。

C/C++は標準の文字コードを規定していないので、その辺はすべて設計者の責任において面倒を見なければいけません。文字化けを起こすなら、それは設計が悪いのであり、文字コード関連の理解が足りないのです。

GDBで追ってみても、原因がわからず、printfデバッグを使って原因を突き止めたら・・・

普通は逆のような気がしますが……(printfデバッグではよく判らないからデバッガーを使う)。素のgdbは途轍もなく面倒なので、Linuxで動かすならEclipseなどのGUIフロントエンドを使った方が良いですよ。

の部分でセグメンテーションフォルトを起こしていました。
もぉ・・・何がなんだか・・・

よく判らないアクセス違反の原因のほとんどは、それが発生した場所ではなく、そこに至るどこかに不備があって、それを見逃したことによるものです。まずは、ご自身の書いたコードにバグがないかどうかを確認してください。バグってバッファオーバランか何かして挙動が不安定になり、たまたまそこでアクセス違反を起こしたということかもしれません。

投稿2018/05/03 15:27

catsforepaw

総合スコア5938

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

strike1217

2018/05/03 15:33

「そんなことはありません。C++による商用アプリの開発でも広く使われています」 そうですか・・・ では安心して利用できるわけですね。
strike1217

2018/05/03 15:36

std::cout の文字化けは、std::printfを使った途端に直ったのでstd::coutが原因なのではないかなぁ・・・と考えているんです。
catsforepaw

2018/05/03 15:55

コードを見ていませんし、どのような文字化けかも判りませんので、私には何が原因かは判りません。どうしてもcoutを疑うのなら、それを質問にしてみてはどうでしょうか。再現させるコードと文字化けの状況説明付きで。 まぁ、私はcoutの変態的な書式指定が大嫌いなのでC++でも躊躇なくprintfを使っていますが。
strike1217

2018/05/03 15:59

「私はcoutの変態的な書式指定が大嫌いなので」 そうですね。 確かに、その通りですね。 以前のおかしなコードは消してしまったので、また同じ現象が起きたら再度質問させてもらいます。
guest

0

他者が回答してくれているので一般論です。かなり脱線します。

多機能なものは、落とし穴も多い。

という典型例ですね。C++はCよりも多機能なので、私もつい後方互換性に頼ってCに逃げたくなることは多々あります。が、やはりC++を使うときにCの書き方をするのは不自然です。この辺りは名著EffectiveC++シリーズとかを読むと色々考えさせられます。ただ、落とし穴について知見が広まる分余計にCに逃げたくなるかもしれません。

「不安定」という表現が正しいかはともかく、自信がなく敬遠するといったことは多々あります。とはいえSTLは非常に魅力的なライブラリなのでうまく使うことができれば、C++プログラミング効率は格段に向上するはずです。逆にC言語は良くも悪くも「枯れた」ものであり、現在のコンピュータプログラミングにおいては標準ライブラリが貧弱とも考えうるものです。勿論Cだけでもいろいろプログラミングできますけれど、実用的なプログラミングのためには他の言語や非標準ライブラリの知見も必要になってきているところです。勿論、最初から別の言語(Pythonとか)を学ぶというのもアリですが。

投稿2018/05/03 15:27

HogeAnimalLover

総合スコア4830

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

strike1217

2018/05/03 15:38

「やはりC++を使うときにCの書き方をするのは不自然です。」 んーー。やはりそうですか。 「C言語は良くも悪くも「枯れた」ものであり、現在のコンピュータプログラミングにおいては標準ライブラリが貧弱とも考えうるものです。」 そうですか。 すでに時代遅れ言語・・・という感じですかね。
HogeAnimalLover

2018/05/03 16:24

もちろんコマンドベースのプログラムやLinux、組み込み分野なり用途は多々あります。が、汎用用途ではやはりWindowsプログラムとかWebベース上で動作するものが好まれているところだと思います(いわゆるデスクトップアプリ、ウェブアプリ)。少なくともGUIやネットワーク、並列処理を標準でサポートしていないというのは厳しいです。もっともC++もすべてカバーしているわけではありませんが。 Cに限った話ではありませんが、プログラミング言語はあくまでもコンピュータ処理の一手段に過ぎません。この発展の背景にはIT社会の環境、ニーズが関係してきます。C言語の場合はUnixの発展が関係したわけですが、Unixは現在の主流とまではいえないOSです。標準ライブラリの更新が行われていないので、近年のニーズに対応しきれてはいないと言わざるを得ないと思います。 また、現在はコンピュータの低コスト化に伴い、演算コスト(CPU、メモリ負担)よりも人的コスト(エンジニアに対する給料)の方が重要視されてきています。こうなると、高速性より多機能性や互換性の方が優先されますのでCよりもPythonとかjavaの方が注目されているといえます。
strike1217

2018/05/03 16:26

げげ!!そうなんですか!!
HogeAnimalLover

2018/05/03 16:48

失礼、少し誇張しすぎたかもしれません。C/C++も充分ニーズはあります。 ただし、GUIやネットワーク機能のためにはOSのAPIを利用する必要があるので、非標準機能を学ぶなどの労力が必要であることは事実です。非標準機能は環境ごとに個別処理が必要ですし、バージョンが違うだけで大きくやり方が変わることも多々ありえます。これはプログラマから見れば大きな負担です。少なくとも私の場合は非標準機能を学び続けるのに疲れましたので、これらの機能を使うならばjavaを使いたいです。
guest

0

「不安定」ではないが、こちらの事情を考慮する「親切心」はないですね
coutの初期化順によるバグなんて
coutの<<オペレータ初回呼び出し時にcout初期化してくれりゃ済む話なんですが
C++はそういう事をプログラマに任せる言語なんです。

文字化けについて心当たりは

c++

1#include <iostream> 2#include <string> 3 4int main(void) { 5 using namespace std::string_literals; 6 auto h = "hoge\0hage"s; 7 std::cout << h.c_str() << std::endl; 8 std::cout << h << std::endl; 9 std::cout << h.size() << std::endl; 10} 11

結果

hoge hogehage 9

と、なります。

SEGVについてはロケールがどうなってるか気になりますね。
locale::global(locale(""));をmain関数頭あたりで実行してみてはどうでしょう。

投稿2018/05/03 15:00

asm

総合スコア15147

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

strike1217

2018/05/03 15:28

セグメンテーションフォルトはファイルを一度消して再度作り直してしまいました。 今度同じ状態に落ちたら、localeというものを試してみます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問