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

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

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

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

Q&A

解決済

3回答

1190閲覧

vector<> try catch();構文を使って例外を補足したいが画面に何も表示されない原因とは cl.exeコンパイラ

退会済みユーザー

退会済みユーザー

総合スコア0

C++

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

0グッド

0クリップ

投稿2020/07/26 06:03

提示コードですがtry catch{ } 構文を使ってvectorで出た例外を補足したいのですがなぜ画面に何も表示されないのでしょうか?たとえtry catch構文そもそもがおかしくても最後のprintf();であああああと出力されるはずなのですがなぜ何も表示されないのかわかりません。
保存して cl main.cppをしてmain.exe を実行 表示なし
保存して cl /EHsc main.cpp をしてmain.exe 実行 表示なし

cl /EHsc のほうのコマンドは警告文やnote など何も表示されないため正常にコンパイルが通っているものと思われるのですが以前として何も表示されません。

#include "stdio.h" #include <vector> int main() { //idx.emplace_back(0); //idx[0].emplace_back(0); try { std::vector<std::vector<int>> idx; printf("idx: %d\n",idx[0][0]); }catch(std::exception &e) { printf("いいいいいいい\n"); //printf("%s\n",e.message()); printf("%s\n,",e.what()); } printf("あああああああ\n"); return 0; }

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

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

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

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

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

guest

回答3

0

こんにちは。

その内容では通常はC++の例外は発生しません。OSが不正メモリアクセスを検出し、シグナルを投げたり(linux)、構造化例外を投げたり(Windows)します。

OSの異常検出はC++の例外ではないので通常はtry-catchでキャッチできません

Windowsでは、不正メモリアクセスのようなOSが検出して投げる例外を構造化例外(SEH)と呼んでいて、それをキャッチする専用の構文があります
また、/Ehaオプションでコンパイルすると構造化例外をtry-catchでキャッチできるようです。

投稿2020/07/26 06:18

Chironian

総合スコア23272

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

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

dodox86

2020/07/26 06:23

>質問者さん Visual Studio 2019 のcl.exeでコンパイル、コマンドプロンプト上で実行したところでは、Windowsの「<実行ファイル名>は動作を停止しました 問題が発生したため...」のエラーのメッセージボックスが出現しました。(参考まで)
退会済みユーザー

退会済みユーザー

2020/07/26 08:12 編集

自己解決しました。
guest

0

printf("idx: %d\n", idx.at(0).at(0));

じゃないと例外は飛ばんのでは。

投稿2020/07/26 06:21

episteme

総合スコア16614

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

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

0

ベストアンサー

try catch{ } 構文を使ってvectorで出た例外を補足したいのですが

vectorの範囲外を[]で参照した場合の動作は未定義です。一般には、「でたらめな場所を読み書きしてそのまま続行される」あるいは「不正アクセスでクラッシュする」のような動作になります。

他の回答にありますが、.at()は範囲外アクセスに対してout_of_rangeというC++の例外を投げるという動作が保証されています。

投稿2020/07/26 06:44

編集2020/07/26 06:45
maisumakun

総合スコア145184

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

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

退会済みユーザー

退会済みユーザー

2020/07/26 07:11

そのクラッシュを制御する方法はあるのでしょうか?
episteme

2020/07/26 07:15 編集

制御するって...何したいんでしょか。 [n] 改め at(n) とすれば範囲外で例外飛ぶので"制御"できますけど
maisumakun

2020/07/26 07:15

何のためにそれをしたいのでしょうか? (「例外処理に持ち込みたい」だけなら、.atへ書き直すのがいちばん妥当な手段です)
退会済みユーザー

退会済みユーザー

2020/07/26 07:19

なるほど。at()に書き直すことにしました。質問ですが不正アクセスでクラッシュするときってどうやって原因を特定するのでしょうか?clコンパイラの場合です。今回のような場合には誰がやっても一瞬でわかりますが規模が大きくなったりした場合知りたいです。何も表示されないため
maisumakun

2020/07/26 07:23

> 不正アクセスでクラッシュするときってどうやって原因を特定するのでしょうか? デバッグビルドで再現するのでしたら、デバッガで監視しながら実行させれば不正アクセスのあった時点でデバッガに移ってくれる…こともあります。 あとは古典的に「どこまで実行されたか」ログを取りつつ実行させていくなど、特定自体が一仕事です。
退会済みユーザー

退会済みユーザー

2020/07/26 07:30

「どこまで実行されたか」ログを取りつつ実行させていくなど」とはつまりprintf();などを使ってということでしょうか?
maisumakun

2020/07/26 07:41

そうですね。ただ、 > try catch構文そもそもがおかしくても最後のprintf();であああああと出力されるはずなのですが 範囲外アクセスは「未定義の動作」になりますので、何1つ保証されません。予想もつかない奇妙キテレツな挙動となることもありえます。
SaitoAtsushi

2020/07/26 08:33

付け加えて言うなら、未定義動作は未定義動作だとされることをしている場所よりもずっと前や後に問題が顕現してもよい (未定義動作が発生するプログラムはプログラム全体の動作が未定義になる) ので実行を追跡して異常な動作を示した箇所で間違った書き方をしているとは限りません。 間違っている箇所よりも前に変な動作をするのは複雑なプログラムで複雑な最適化が絡み合うときなのでそうそうあることではありませんが。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問