• 締切済み

プログラム終了時にエラーが発生する

現在作成中のプログラムは終了する時にアクセス違反が発生しましたと 表示されます。 以前はこの様なことはなかったのですが構造体に変数を追加した直後に起こるようになりました。 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; この変数を消すとエラーが出ることはありません。 まだこの変数は追加しただけで使っていません。終了時にのみ発生します。

みんなの回答

  • wormhole
  • ベストアンサー率28% (1622/5658)
回答No.8

>追加した vector<A_t> Mapをコメントアウトするだけで >正常に動作します。  とりあえず書いておきますが B_t b1; B_t b2; b2 = b1; 上記コード見た目こそ、vector<A_t> B_t::Mapのコピーをしてないように見えますけど実際にはしてるというのはわかりますか? またコピーコンストラクタが必要な場合は、operator=もふつうは必要です。

  • kmee
  • ベストアンサー率55% (1857/3366)
回答No.7

解決するかどうかまではわかりません。 コピーコンストラクタの件は明らかにおかしいから、直しておこう、というものです。 他の要因が無いと断言はできません。 std::vectorを使うときは、いろいろ気を付けなければならない事項があります。 (そうでなくても、C/C++でメモリ関連、となれば、気を付けることばかりです) 「std::vector 自作クラス」あたりで検索してみてください。

  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.6

構造体はクラスの一種. で「あなたの作ったプログラム」は見せてくれないんですか?

  • kmee
  • ベストアンサー率55% (1857/3366)
回答No.5

vector<A_t> が C++ のstd::vectorだとして。 あなたはコピーしている、という意識は無いかもしれませんが、 vectorの中でコピーが行われている可能性が高いです。 その結果 A_tにはコピーコンストラクタが無いので、標準のものが使われる →A_t.To,A_t.E_const の「浅いコピー」が作られる → コピー元が解放される → コピー先は、内部のポインタが解放された領域を指したまま → コピー先も解放 → 既に解放されている といった現象が起っているのではないかと予想されます。

who_ray_sis
質問者

補足

コピーコンストラクタを実装することで解決しそうですね。 ありがとうございます。

  • wormhole
  • ベストアンサー率28% (1622/5658)
回答No.4

>本当に追加しただけでコピーも代入もしていません。 追加した vector<A_t> Map ではなくて追加された側のB_tや、それを使用しているかもしれない構造体やクラスの方です。 それとも構造体の定義だけしかしてない状態でエラーが起きるんですか。

who_ray_sis
質問者

補足

追加した 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% (1622/5658)
回答No.3

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

who_ray_sis
質問者

補足

本当に追加しただけでコピーも代入もしていません。 なので構造体をvectorクラスで保持するのが間違いかと思ったのですが そうではないのですね。

  • wormhole
  • ベストアンサー率28% (1622/5658)
回答No.2

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

who_ray_sis
質問者

補足

過去の回答に補足すいません。 検索してみたのですが、クラスにデストラクタやコピーコンスタラクタを追加する 方法は書いてありましたが、構造体に追加する方法はわかりませんでした。 どのように追加すればよいのでしょうか?

  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.1

プログラムを秘密にしたままでまともな答えが得られるとでも思ってる? あと, _A とか _B なんて名前を使っちゃダメなことは理解してるよね?

関連するQ&A

  • ベクターについて

    ベクターのベクターってどうやって管理すればいいのでしょうか。 今ベクターを勉強中で、普通のpop_backやeraseなら出来るという程度です。 シューティングゲームを作る為に以下のような変数を用意したいのです。 typedef struct{//弾情報   double x,y; }bullet_t; typedef struct{//ショット情報   int knd;   vector<bullet_t> bullet; }shot_t; vector<shot_t> shot;//ショット用変数 今このように宣言したとします。 普通の配列で言うところの shot[n].knd=1; shot[n].bullet[m].x=100; shot[n].bullet[m].y=100; というような代入を適当にいくつか行い、中身の表示を行い、x座標が100以上の弾情報を削除するサンプルを書いていただく事は出来ないでしょうか。 もしくはベクターのベクターの使い方について書いてあるサイトはありませんでしょうか。 どうかよろしくお願いいたします。

  • ポインタを使った構造体のプログラム

    ポインタを使ってメンバに値を入力して表示するプログラムを作ったのですが、mainのstruct XYZ aというオブジェクトと*bというそれを指すポインタを使ってプログラムを表示するにはどうすればいいのでしょうか。 これがプログラムです。 #include <stdio.h> struct XYZ { int x; long int y; double z; }; void set_xyz(struct XYZ *p,int x,long int y,double z) { p->x=x; p->y=y; p->z=z; } //void set_xyz(struct XYZ *,int,long int,double); int main() { struct XYZ a = {12,999999,1.41421356},*b; //ここのポインタ変数bでエラーが表示されます。 set_xyz(b,a.x,a.y,a.z); printf("a.x = %d\na.y = %d\na.z = %lf\n",b->x,b->y,b->z); return 0; } エラーの内容は「初期化されていないローカル変数 'b' が使用されます」となっています。 初歩的な質問ですみません・・・。

  • 構造体の中の構造体

    typedef struct number{ int x; struct number *next; }Num; 初心者な質問で申し訳ないんですが、構造体の中に構造体があるのはどう解釈していいんでしょうか? typedef struct number{ int x; int y; }Num; の場合はNum a,b;がint a.x,a.y,b.x,b.yとなるのは分かるんですが・・・

  • 多次元配列の構造体の初期化

    タイトル通りです。やり方がわかりません。 構造体変数の初期化や多次元配列の初期化が載ってるページは多いのですが、コレだけは調べても解りませんでした。 typedef struct{ int flag; ~~~~~(略)~~~ }map_t; map_t map[64][64]; の後、map_t型のmap64*64の int flag全てに値を代入したいのですが 詳しいやり方が解りません。 int hensuu[3][3]={   {1,2,3},{4,5,6},{7,8,9} }; 普通の多次元配列みたいにmこんな感じでやりたいんですけど… 初心者でスミマセン。回答いただけたらありがたいです。

  • C++テンプレートでの引数

     こんにちは。 今回は、C++ テンプレートで引数に構造体を使えないか悩んでいます。 例えば #include <stdio.h> typedef struct _rect{ int x; int y; }RECT; typedef struct _rect{ double x; double y; }DATA; template <calss T> T Function(T abc) { // 構造体の要素にも対応している。 cout << abc//の要素x << endl; cout << abc//の要素y << endl; return T; } int main() { RECT t; DATA r; t.x = 80; t.y = 90; t = Function(t); // こういった事をしたい r = Function(r); return 0; } というふうにしたいんです。 テンプレート関数に引数として構造体にしてそれぞれの要素を参照する場合はどうすれば よろしいのか教えてください。 よろしくお願いします。

  • プログラムについて

    2分木のプログラムなのですが、関数部分を作るという学校の問題なのですが、習いはじめで構造体など殆ど分かりません。ヒントでも良いので教えてください。合っていないとは思いますが、一応初期化の部分と、終了の部分、ノードの追加部分は考えました。 typedef struct t_Btree { struct t_Btree *left; struct t_Btree *right; int data; } Btree; // Btreeの初期化 void Btree_ini(Btree *a, int b) { a->left=NULL; a->right=NULL; a->data=b; a = (Btree *)malloc(sizeof(Btree)); } // 領域の開放 void Btree_end(Btree *a, int b) { free(a); } // 新しいノードを追加 void Btree_ad(Btree *a, int b) { Btree_tansaku(a, b); a = (Btree *)malloc(sizeof(Btree)); self->left_ = NULL; self->right_ = NULL; self->data_ = b; } // 探索し、bに一致するデータのポインタを返す void *Btree_tansaku(const Btree *a, int b) { } // aのデータのみを出力 void Btree_pri(const Btree *a) { } // 全体を出力 void Btree_tpri(const Btree *a) { } int main(void) { int i; int d[] = {7,3,6,4,1,9,2,0,10,8}; Btree bt; Btree_ini(&bt,5); for(i=0;i<10;i++) Btree_ad(&bt,x[i]); Btree_tpri(&bt); Btree_end(&b); return 0; } おねがいします。

  • map::find()の戻り値が変数に入ってくれません。

    こんにちは、boundaryといいます。 ユーザー型のキーとユーザー型の値をmapに挿入したのです が、map::find()の戻り値が変数に入ってくれません。 operator=を定義しないといけないのかなと思いやってみた のですがうまくいきません。 std::map<ユーザー型,ユーザー型>::iteratorを定義しない といけないのでしょうか? どなたかお知恵をお貸しください。 よろしくおねがいします。 windows2000 vc6.0sp5 ps.ソースコードを載せようとしたのですが、質問文字数が 最長文字数を超えるようで質問する事ができません。 ですのでかなり端折っています。(スミマセン) /* mapのキーです。 */ typedef struct _StateAndReturn { int State; int Return; } StateAndReturn; /* mapの値です。 */ struct NextStateAndFunc { NextStateAndFunc& operator=(const NextStateAndFunc& X){ NextState = X.NextState; MemFuncPointer = X.MemFuncPointer; } typedef int (Funcs::*pFunc)(); int NextState; pFunc MemFuncPointer; }; class CEventMap { private: typedef int (Funcs::*pFunc)(); typedef map<StateAndReturn, NextStateAndFunc, my_less> _EventFuncMap; _EventFuncMap EventFuncMap; public: void Set(int StateNow, int ServerReturnCode, int StateNext, pFunc pF) { /*登録します。*/ } const NextStateAndFunc Answer(int StateNow, int ServerReturnCode) { StateAndReturn tempStateAndReturn; tempStateAndReturn.State = StateNow; tempStateAndReturn.Return = ServerReturnCode; map<StateAndReturn, NextStateAndFunc>::const_iterator ite; ite = EventFuncMap.find(tempStateAndReturn); /* ←ここでエラーになります。 */ return ite->second; } };

  • c言語のmalloc()とエラー表示

    .malloc()については以前も質問させて頂きましたが 新たな疑問についてご教示下さい。 ・下記のプログラムでmalloc()とrealloc()は正常に作動していると思いますが、入力表示を有効にすると下記の「エラー表示」が表示されます。 ・「エラー表示」されてもプログラムは最後まで実行される様です。 ・n=400までは表示されます。 ・この理由が分かりません、ご教示下さい。 ・malloc()関係は不安定な関数群でしょうか? ■「エラー表示」について *********************************************************** 問題が発生したため、***.exeを終了します。ご不便をおかけて申し訳ありません。 作業途中・・・・・ この問題を「マイクロソフト」に報告ください。 ************************************************************ ・一部ですが以上の様なエラー表示です。 //malloc_2 #include <stdio.h> #include <stdlib.h> void MylnOut(int ,int ,int *); //************************************************************** // MAIN //************************************************************** int main() { int *map; int X=10,Y=10,n; /* 疑似2次元配列確保と初期表示 */   printf("初期値.... \n");   map=(int *)malloc(sizeof(X*Y)); // MylnOut( X, Y, map); /* 変更数値入力 */ for(n=1;n<401;n++){   X=rand()%50+2;   Y=rand()%50+2;   printf("変更..%3d回目 X=%2d Y=%2d\n",n,X,Y); /* 領域変更と表示 */   map=(int *)realloc(map,sizeof(X*Y)); // MylnOut( X, Y, map); } /* 領域開放 */   free(map);   map=NULL; return 0; //************************************************************** // 入力・表示 //************************************************************** void MylnOut(int X,int Y,int *map) {   int i,j;   for(j=0;j<Y;j++)    for(i=0;i<X;i++) map[j*Y+i]=X;   for(j=0;j<Y;j++){    for(i=0;i<X;i++) printf("%3d",map[j*Y+i]);    printf("\n");   } } ・コンパイルエラーは無く実行時エラーです。 .Borland C++ Compiler 5.5.1,TuboDebugger 5.5を使用しています。

  • 構造体メンバへの代入

    とても初歩的なことなのですが、 typedef struct _X{ int x; }X[50]; と構造体を定義して X[0].x = 0; と0を代入しようとすると、「宣言が正しく終了していない」とエラーが出てしまいます。 これはなぜでしょうか? ちなみにMicrosoft Visual C++ 2005 Express Editionを使っています。

  • プログラムの組み方が分かりません。

    ある課題で以下の問題が出題されました。 >>>> 2つのint型変数x,yにキーボードから値を入力し、その大小を判定する関数funcを作成せよ。この課題では、大きいと判定された数が代入された変数のアドレスがmain関数に戻されるものとする。 ============ #include<stdio.h> int *func(int *a,int *b) { /* 2つの値の大小判定を行い、アドレスを返す */ } main(void) { int x, y, *z; /* 変数 x,yにキーボードからデータを入力する */ /* 関数funcの呼び出し */ /* 変数zを用いて値の出力を行う */ } ============ <<<< 2行目の*funcというように、関数の頭に*が付くプログラムは初めてで、 どういう意味かもさっぱりわかりません。 それも含め、この問題はどういう風解けばいいのか、教えてください。 お願いします。

専門家に質問してみよう