- ベストアンサー
セグメンテーションエラー
C++ on Vine (バージョン共にわからず)です。 セグメンテーションエラーは、メモリの領域破壊の時にでるようですが、 その他の原因はありますか? また、メモリの領域破壊とは、 配列の要素数以上に要素を詰め込もうとしたとき 以外の要因はありますか? ポインタを使えばいろいろ破壊できそうですが、 そういうのはなしで。
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
領域破壊の時にもでますが、領域破壊直後でなく「破壊された領域を破壊されていないと勘違いして動作したとき」に出る方がやっかいです。 追跡に時間がかかりますから。 ・スタックが破壊されているときにreturn ・あり得ないアドレスの関数を呼び出し ・破壊された動的メモリの解放 ・動的メモリ領域が破壊された状態で再び動的メモリの確保 などなど システム領域を破壊しているとAPI/システムコールを使ったときやプロセス終了時にいきなり出ることもあります。
その他の回答 (2)
- toysmith
- ベストアンサー率37% (570/1525)
自分でコードを書いていたらセグメンテーションフォルトが発生したときに直感で【怪しい場所】が思いつきます。 逆に言うと、そういう直感の働かない人はプログラマには向いてないんだと思います。 他人の書いたコードとか体調が悪いとかで勘が働かないときはじっくり追跡します。 一つ一つの可能性を全て検査することはありません。 (数万~数十万行のソースを相手にしてると全ての可能性を検証することは不可能) 動的メモリ破壊が問題なのか?スタック破壊が問題なのか?単純にポインタが狂っちゃってるのか?などの切り分けは落ちた瞬間にアタリがつきます。 って、答えになってないですね。
お礼
そういう勘はプログラミングの経験を積むことで得られるものですよね。 私の場合、C++こそ半年程度の経験しかないですが、 CやBASICで数年程度の経験があり、 数百行程度のソースのバグ取りで半月ぐらいかかるのはざらにあります。 私はプログラマに向かないんでしょうか?(がっくり)
- hogeta
- ベストアンサー率14% (4/28)
セグメントまわりのエラーは、アクセスを許可されていないメモリ領域に対して読み書きを行なおうと場合に 発生します。 例えば、ポインタに変な値を代入してしまって、指しているアドレスがカーネル領域だったりしたときですね。
補足
いろいろあるものですね。 みなさんはセグメンテーションエラーが出たときは こういう可能性を一つずつ試すのでしょうか?