2011-11-14 5 views
0

私は2つのクラスを含むプログラムを作った。基本クラスには、派生クラスのポインタオブジェクトが含まれます。次に、基本クラスのコンストラクタでポインタオブジェクトを初期化します。ベースクラスのメモリ割り当てエラーを修正するにはどうすればよいですか?

コンパイル時にマイコンパイラでエラーが表示されず、コンソールウィンドウが表示されたときにプログラムがクラッシュし、派生クラスのオブジェクトにエラーUNHANDLED EXCEPION BAD ALLOCATIONが与えられました。それを修正するために私は何をすべきですか? - 原因はおそらくです

class x; 

class y 
{ 
    private: 

     x *objx; // here is the error 
    ........................... 

}; 

class x: public y 
{ 
    ........................... 
    ................ 
}; 

y::y() 
{ 
    objx=new x(); // bad allocation and the program crashes 

    // I have also tried this way by commenting objx=new x(); 

    *objx=0; // but still the program crashes. 
} 
+0

:あなたは、コンストラクタにnullにポインタを設定してみてくださいと実際のオブジェクトになるだろう方法のinitを作成することもできます。 – Tudor

+0

これはどの言語ですか?それに応じてタグ付けする必要があります。 – jonsca

答えて

1

あなたがそこに行く再帰的な建設の問題を持つことになりますように見える親クラスのコンストラクタを呼び出す派生クラスでコンストラクタを呼び出して以来:ここ

コードです例外。

"new x()"をコンストラクタから独自の関数に移動できないようにするには、次のようにします。

+0

しかし、コンパイラは、派生クラスのデータメンバの初期化にエラーを返します。私は今何をするのですか? –

1

別の答えで説明したように、あなたは無限に再帰的な構造問題があります。あなたのコードのインデントを修正してください

y::y() 
{ 
    // *objx=0; // this is wrong, you don't want to dereference your pointer. 
    objx = 0; // this should work 
} 

void y::init() 
{ 
    objx = new x(); 
} 
+0

私もそれを試してみました。しかし、私が以前に述べたような問題は、これを好きにすると、ParentクラスYと派生クラスxのデータメンバーは初期化されずに残ります。 –

+0

エラーがポップアップして pacman.exeの0x00401dd9で処理されない例外が発生しました。0xC0000005:0x00000020の場所を読み取っているアクセス違反。 クラスxとyのすべてのデータメンバーについて –

+0

オブジェクトを作成した後でinit()を呼び出すことはできますか? Y y; y.init(); – Barth

関連する問題