- 締切済み
プログラム終了時にエラーが発生する
現在作成中のプログラムは終了する時にアクセス違反が発生しましたと 表示されます。 以前はこの様なことはなかったのですが構造体に変数を追加した直後に起こるようになりました。 typedef struct _A{ int x,y; int cost; vector<int> To; vector<int> E_cost; }A_t; typedef struct _B{ double x,y; int sex; char Name[20]; vector<int> root; vector<A_t> Map; //このMapという変数を追加するとエラーがでる。 }B_t; この変数を消すとエラーが出ることはありません。 まだこの変数は追加しただけで使っていません。終了時にのみ発生します。
- みんなの回答 (8)
- 専門家の回答
みんなの回答
- wormhole
- ベストアンサー率28% (1626/5665)
>追加した vector<A_t> Mapをコメントアウトするだけで >正常に動作します。 とりあえず書いておきますが B_t b1; B_t b2; b2 = b1; 上記コード見た目こそ、vector<A_t> B_t::Mapのコピーをしてないように見えますけど実際にはしてるというのはわかりますか? またコピーコンストラクタが必要な場合は、operator=もふつうは必要です。
- kmee
- ベストアンサー率55% (1857/3366)
解決するかどうかまではわかりません。 コピーコンストラクタの件は明らかにおかしいから、直しておこう、というものです。 他の要因が無いと断言はできません。 std::vectorを使うときは、いろいろ気を付けなければならない事項があります。 (そうでなくても、C/C++でメモリ関連、となれば、気を付けることばかりです) 「std::vector 自作クラス」あたりで検索してみてください。
- Tacosan
- ベストアンサー率23% (3656/15482)
構造体はクラスの一種. で「あなたの作ったプログラム」は見せてくれないんですか?
- kmee
- ベストアンサー率55% (1857/3366)
vector<A_t> が C++ のstd::vectorだとして。 あなたはコピーしている、という意識は無いかもしれませんが、 vectorの中でコピーが行われている可能性が高いです。 その結果 A_tにはコピーコンストラクタが無いので、標準のものが使われる →A_t.To,A_t.E_const の「浅いコピー」が作られる → コピー元が解放される → コピー先は、内部のポインタが解放された領域を指したまま → コピー先も解放 → 既に解放されている といった現象が起っているのではないかと予想されます。
- wormhole
- ベストアンサー率28% (1626/5665)
>本当に追加しただけでコピーも代入もしていません。 追加した vector<A_t> Map ではなくて追加された側のB_tや、それを使用しているかもしれない構造体やクラスの方です。 それとも構造体の定義だけしかしてない状態でエラーが起きるんですか。
補足
追加した vector<A_t> Mapをコメントアウトするだけで 正常に動作します。 ご指摘頂いた追加された側をチェックしてきます。 載せ忘れていたエラーで止まっている箇所を張っておきいます。 #if _ITERATOR_DEBUG_LEVEL == 2 if (_Myproxy != 0) { // proxy allocated, drain it _Lockit _Lock(_LOCK_DEBUG); for (_Iterator_base12 **_Pnext = &_Myproxy->_Myfirstiter; *_Pnext != 0; *_Pnext = (*_Pnext)->_Mynextiter) (*_Pnext)->_Myproxy = 0; //この行で止まっている。 _Myproxy->_Myfirstiter = 0; } #endif /* _ITERATOR_DEBUG_LEVEL == 2 */ }
- wormhole
- ベストアンサー率28% (1626/5665)
#2です。 他に思いつく点としては ・コピーコンストラクタやoperator=()を定義が必要なのにしていない。 ・memcpyでコピーしてはいけないものをコピーしてる。 などなど
補足
本当に追加しただけでコピーも代入もしていません。 なので構造体をvectorクラスで保持するのが間違いかと思ったのですが そうではないのですね。
- wormhole
- ベストアンサー率28% (1626/5665)
そういう場合は、たいてい今まで表面化してなかっただけでどこかでバッファオーバーランなどやらかしてます。
補足
過去の回答に補足すいません。 検索してみたのですが、クラスにデストラクタやコピーコンスタラクタを追加する 方法は書いてありましたが、構造体に追加する方法はわかりませんでした。 どのように追加すればよいのでしょうか?
- Tacosan
- ベストアンサー率23% (3656/15482)
プログラムを秘密にしたままでまともな答えが得られるとでも思ってる? あと, _A とか _B なんて名前を使っちゃダメなことは理解してるよね?
補足
コピーコンストラクタを実装することで解決しそうですね。 ありがとうございます。