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

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

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

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

Q&A

解決済

5回答

6867閲覧

[Xcode]C++で発生するEXC_BAD_ACCESSの例外処理について

退会済みユーザー

退会済みユーザー

総合スコア0

C++

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

0グッド

0クリップ

投稿2019/02/26 01:06

前提・実現したいこと

Xcodeで開発しているC++プログラムで発生するEXC_BAD_ACCESS を例外処理したいです。

発生している問題・エラーメッセージ

調べたところこの例外は処理出来ないと書いてありました。
EXC_BAD_ACCESSはつまり例外ではないということですか?よくわかりません。
参考サイト

該当のソースコード

C++

1class sample{ 2public: 3 int var; 4} 5 6int main() 7{ 8 sample *obj = nullptr; 9 obj->var = 10; //当然例外が起こる 10}

試したこと

C++

1class sample{ 2public: 3 int var; 4} 5 6int main() 7{ 8 sample *obj = nullptr; 9 try{ 10 obj->var = 10; 11 } catch(EXC_BAD_ACCESS e){ //EXC_BAD_ACCESSは未定義でエラー 12 //処理 13 } 14}

標準例外には載っていませんでした。

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

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

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

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

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

t_obara

2019/02/26 01:19

> 実際にはリスト構造のクラス ということであれば、コンストラクタで初期化するのがよろしいかと。 sample::sample(): next(NULL) {}
guest

回答5

0

ベストアンサー

C++

1 sample *obj = nullptr; 2 obj->var = 10; //当然例外が起こる

nullptrに対して逆参照を行ったときの動作は未定義、つまり「何も保証されていない」ということになります。要は「コンピューターが壊れようが、鼻から悪魔が飛び出そうが、そんなことは知りません」ということです。

JavaやJavaScriptのようにnull参照を言語内の例外として扱える言語もありますが、C++は不可能です。「事前にチェックして(あるいはスマートポインタを使って)NULLから参照させない」というのが唯一の手段です。

投稿2019/02/26 01:13

maisumakun

総合スコア145183

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

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

0

こんにちは。

EXC_BAD_ACCESSはシグナルとして通知されるようですね。
SIGABRTやEXC_BAD_ACCESSでエラー内容が出ない時の対処法等の対処にて、スタック・ダンプすることが可能なようです。

恐らく頑張れば、シグナルからの回復も可能とは思いますが、不正メモリ・アクセスを「許す」ようなプログラミングは危険すぎるので、シグナルをハンドルして回復させるのではなく、シグナルが発生したらそれを発生させた不具合を修正することをお勧めします。(落とさないということは誤動作しつつ動作を継続するということです。落とせば誤動作の可能性が減り、かつ、修正圧力が高くなります。)

投稿2019/02/26 03:08

Chironian

総合スコア23272

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

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

0

範囲外アクセスです
アクセスすべきでないところにアクセスしている、ということで、その時点でシステムは破綻しています
これが出るのは、(意図して出しているものを除き)プログラムが暴走し、メモリのナカミを壊しまくった果てにでるものですので、例外処理などというものはできません

投稿2019/02/26 01:13

y_waiwai

総合スコア87774

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

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

0

EXC_BAD_ACCESSはメモリアクセス違反を示す例外です。
当該エラー後はメモリが正しい保証がありませんので、プログラムが正しく動く保証もありません。
例外をキャッチすることは不可能ではないですが、やってはいけません。

投稿2019/02/26 01:10

kazto

総合スコア7196

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

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

0

ちゃんと初期化しなさい。

c++

1 sample *obj = nullptr;

ではなく、下記の通りです。ちなみにこれをインスタンスと言います。

c++

1 sample *obj = new sample();

投稿2019/02/26 01:09

stdio

総合スコア3307

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

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

退会済みユーザー

退会済みユーザー

2019/02/26 01:16

言葉足らずですみません。 実際にはリスト構造のクラスを作成していて `obj->next` を参照することがあるのですが、pullptrで初期化されたもののメンバ変数を参照してしまいます。 原因はわかっているのですが、例外処理がしたく質問しました。 ifでnullptrか判断するばいいことなのですが、、、
maisumakun

2019/02/26 01:26 編集

自分の回答にもありますが、C++では「ifでnullptrか判断する」あるいは「スマートポインタを使う」というのが解決策です。null参照の例外は、起こした時点で何も保証されない世界に突入します(あとから例外で回収はできません)。
stdio

2019/02/26 01:56

古典的な方法しか取れないながC++の世界ですので仕方ないですね。 「ifでnullptr(NULL)か判断する」以外に解決策はありませんよ。 あと、質問を簡略化しすぎですね。obj->nextなら素直にリストと付け加えましょう。 てっきりC++の知識がない素人が質問してきているようにしか見えません。
退会済みユーザー

退会済みユーザー

2019/02/26 03:01

なるほど!わかりました。 nullptrか判断して処理することにします! 回答ありがとうございました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問