プロが教えるわが家の防犯対策術!

現在作成中のプログラムは終了する時にアクセス違反が発生しましたと
表示されます。
以前はこの様なことはなかったのですが構造体に変数を追加した直後に起こるようになりました。

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;

この変数を消すとエラーが出ることはありません。

まだこの変数は追加しただけで使っていません。終了時にのみ発生します。

A 回答 (8件)

プログラムを秘密にしたままでまともな答えが得られるとでも思ってる?



あと, _A とか _B なんて名前を使っちゃダメなことは理解してるよね?
    • good
    • 0

そういう場合は、たいてい今まで表面化してなかっただけでどこかでバッファオーバーランなどやらかしてます。

この回答への補足

過去の回答に補足すいません。

検索してみたのですが、クラスにデストラクタやコピーコンスタラクタを追加する
方法は書いてありましたが、構造体に追加する方法はわかりませんでした。

どのように追加すればよいのでしょうか?

補足日時:2014/12/17 13:49
    • good
    • 0

#2です。


他に思いつく点としては
・コピーコンストラクタやoperator=()を定義が必要なのにしていない。
・memcpyでコピーしてはいけないものをコピーしてる。
などなど

この回答への補足

本当に追加しただけでコピーも代入もしていません。

なので構造体をvectorクラスで保持するのが間違いかと思ったのですが
そうではないのですね。

補足日時:2014/12/16 18:28
    • good
    • 0

>本当に追加しただけでコピーも代入もしていません。



追加した
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 */
}

補足日時:2014/12/16 22:30
    • good
    • 0

vector<A_t> が C++ のstd::vectorだとして。



あなたはコピーしている、という意識は無いかもしれませんが、 vectorの中でコピーが行われている可能性が高いです。

その結果

A_tにはコピーコンストラクタが無いので、標準のものが使われる
→A_t.To,A_t.E_const の「浅いコピー」が作られる
→ コピー元が解放される
→ コピー先は、内部のポインタが解放された領域を指したまま
→ コピー先も解放
→ 既に解放されている

といった現象が起っているのではないかと予想されます。

この回答への補足

コピーコンストラクタを実装することで解決しそうですね。

ありがとうございます。

補足日時:2014/12/17 00:13
    • good
    • 0

構造体はクラスの一種.



で「あなたの作ったプログラム」は見せてくれないんですか?
    • good
    • 0

解決するかどうかまではわかりません。


コピーコンストラクタの件は明らかにおかしいから、直しておこう、というものです。
他の要因が無いと断言はできません。

std::vectorを使うときは、いろいろ気を付けなければならない事項があります。
(そうでなくても、C/C++でメモリ関連、となれば、気を付けることばかりです)
「std::vector 自作クラス」あたりで検索してみてください。
    • good
    • 0

>追加した vector<A_t> Mapをコメントアウトするだけで


>正常に動作します。 

とりあえず書いておきますが

B_t b1;
B_t b2;
b2 = b1;

上記コード見た目こそ、vector<A_t> B_t::Mapのコピーをしてないように見えますけど実際にはしてるというのはわかりますか?
またコピーコンストラクタが必要な場合は、operator=もふつうは必要です。
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!