2017-01-07 4 views
0

boolという属性を持つクラスがglobalとあります。オブジェクトがその属性の1つにアクセスしようとするたびにSegfaultを送信する可能性はありますか?

外部からそのメソッドの1つを呼び出すときにセグメンテーションエラーが発生しました。

基本的に、私はこのメソッドを呼び出します。このメソッドは内部的に別のメソッドを呼び出します。このメソッドは別のメソッドなどを呼び出します(これは、それぞれのメソッドが少し複雑になるためです)。

メソッド呼び出しチェーンの最後に、属性globalをチェックし、その内容に基づいて異なる方法を実行するメソッドがあります。

gdbを使用するこの最後の方法では、正確な行if (global) {でセグメント化エラーが生成されていることがわかりました。私は、メソッドチェーン内でこの条件チェックを上げようとしましたが(メソッドチェーン内で深く続ける前に条件がチェックされるように)、結果は変わりません(つまり、どこに置かれても、常にif (global) {はセグメンテーションフォールト)。

属性globalをチェックすると、セグメント違反が発生する可能性はありますか?これはどういう意味ですか?この原因は何ですか?

私はg++ -std=c++11 -Wall -Wextra -pedantic -gでコンパイルしています。

+3

Re: "これは何が原因ですか?" - あなたのコードに誤りがあります。それを見つける方法は、問題がなくなるまでコードを削除し、最後に削除したビットを追加し、問題が解決しなくなるまで他のものを削除し続けることです。完了するまで繰り返す。コードをコンパイルして実行し、問題を示すことができる最小のプログラムまでコードを取得したら、何が間違っているのかを把握することができます。そうでない場合は、最小限のプログラムを投稿してください。 –

+2

私は、クライアントがオブジェクトポインタを介してメソッドを呼び出すと予測します。オブジェクトポインタはNULLか無効です。このプログラムは、 'this'が実際にオブジェクトのデータメンバにアクセスするために初めて使用されたときにクラッシュします。 –

+0

segフォルトが表示されている場合は、コンパイルフラグとリンクフラグに '-fsanitize = address'を追加してみてください。 *なぜ* segフォールトが発生するのかについての詳細が表示されます。 –

答えて

0

セグメント違反(SIGSEGV)は、プログラムがそのアドレス空間外のメモリにアクセスしようとしたことを意味します。 これは、通常、初期化されていないポインタや、寿命が終了したオブジェクトへのポインタを逆参照したり、スタックの末尾などを読み取ったりすることによって発生します。

+0

私はそれはオブジェクトの寿命が終了したためだと思いますが、プログラムに気づいた削除されたオブジェクトのメソッドを呼び出すことができます(または属性がチェックされたときにのみ気づく)のですか? – user6245072

+0

はい。コンパイラは、あなたが未定義の振る舞いをするのを止めるわけではありません。あなたの責任はそれだけではありません。 –

関連する問題