オブジェクトのメンバ変数でアクセス違反が発生する

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
bidou

オブジェクトのメンバ変数でアクセス違反が発生する

#1

投稿記事 by bidou » 10年前

現在クラスを用いたプログラミングの学習の目的で、以下のコードを稼働させたいです。
コンパイラ:Visual Studio 2013
OS :Windows8.1(64bit)
言語 :C++

以下のプログラムを実行すると
P->Process(i);の関数を実行した際に46行目でメンバ変数P->Noを参照しようとし、
ハンドルされていない例外が発生しました: 0xC0000005: 場所 0x00000000 を読み込み中にアクセス違反が発生しました。
というアクセス違反の警告が出てプログラムが最後まで稼働できません。
アクセス違反を回避し処理を続行させるにはどうすればよいのでしょうか?

Source.cpp

コード:

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include"Header.h"

Myclass *P[256];
int Count = 0;

Myclass::Myclass(){
	No = Count;
	printf("No = %d\n", No);
	Count++;
	x = 8;
}
Myclass::~Myclass(){

}
int End = 0;
int p;
int main(void){	
	while (End == 0){
		printf("クラスを作る?yesなら1/noなら0\n");
		scanf("%d", &p);
		if (p == 1){
			P[Count] = new Myclass;
			printf("%dつめのクラス\n", Count);
		}
		else{
			printf("もう十分作った\n");
			End = 1;
		}
	
	}
	
	for (int i = 0; i < Count - 1; i++){
		P[i]->Process(i);
	    printf("%dつめのクラスを崩した\n", P[i]->No);
		delete P[i];
		
	}
	getchar();
	
	return 0;
}

void Myclass::Process(int i){
	printf("!!!!!%d\n",P[i]->No);
}
Header.h

コード:

class Myclass{
public:
	Myclass();
	~Myclass();

	int No = 0;
	int x = 0;
	char* word;
	void Process(int);
};

アバター
usao
記事: 1889
登録日時: 12年前
連絡を取る:

Re: オブジェクトのメンバ変数でアクセス違反が発生する

#2

投稿記事 by usao » 10年前

Header.hの方の6行目と7行目の =0 がコンパイルエラーになる気がしますが.


アクセス違反の原因ですが,おそらく 24行目の

>P[Count] = new Myclass;

が初回実行されるとき,
まずMyclassのコンストラクタが呼ばれて
>Count++;
によって,Countが1になり,
P[1]にnewしたMyclassインスタンスを指すポインタ値を格納することになるのではないでしょうか.
(P[0]の値が不定 → 以降でP[0]を参照するので怒られる ということでは)

bidou

Re: オブジェクトのメンバ変数でアクセス違反が発生する

#3

投稿記事 by bidou » 10年前

ありがとうございます。Countの増加タイミングをnewの直後にすることで解決できました。

閉鎖

“C言語何でも質問掲示板” へ戻る