new演算子で困っています

このQ&Aのポイント
  • 基底クラスclass1と派生クラスclass2でnewを使って同じサイズの2次元配列pとqを作ったのですが、メモリ内の同じ場所を参照してるみたいで、class2の配列qで配列の中身を書き換えたら、class1の配列pの中身も書き換えられているんですが、対処法があれば教えてください。
  • class1とclass2で作成した2次元配列のメモリ参照問題について困っています。class2で配列の中身を書き換えたら、class1の配列も書き換えられてしまう現象が起きています。解決策をご教示いただけますでしょうか。
  • new演算子に関する問題です。class1とclass2で同じサイズの2次元配列を作成しましたが、class2で配列の中身を変更するとclass1の配列も変更されてしまいます。この問題の対処方法を教えてください。
回答を見る
  • ベストアンサー

new演算子で困っています。

基底クラスclass1と派生クラスclass2でnewを使って同じサイズの2次元配列pとqを作ったのですが、メモリ内の同じ場所を参照してるみたいで、class2の配列qで配列の中身を書き換えたら、class1の配列pの中身も書き換えられているんですが、対処法があれば教えてください。 class class1{ protected:      int** p; public:     class1(int n)     {   int i;        *p=new int[n];        for(i=0;i<n;i++){          p[i]=new int[2];        }      }    :    : }; class class2 : public class1{     int** q; public:     class2(int n)     {   int i;        *q=new int[n];        for(i=0;i<n;i++){         q[i]=new int[2];        } }    :    : };

  • 1025
  • お礼率68% (15/22)

質問者が選んだベストアンサー

  • ベストアンサー
  • wr250zb
  • ベストアンサー率41% (7/17)
回答No.2

こうだと思う。 class CClassA { protected: int** p; int _nCntA; public: CClassA( int n ) { _nCntA = n; p = new int*[ n ]; // ポインタ配列を確保 for( int ii = 0; ii < n; ii++ ){ p[ ii ] = new int[ _nCntA ]; } } // デストラクタは省略 }; class CClassB : public CClassA { protected: int** q; public: CClassB( int n ) : CClassA( n ) { q = new int*[ n ]; // ポインタ配列を確保 for( int ii = 0; ii < n; ii++ ){ q[ ii ] = new int[ 2 ]; } } // デストラクタは省略 };

1025
質問者

お礼

できました。たすかりました。ありがとうございました。

その他の回答 (1)

  • wr250zb
  • ベストアンサー率41% (7/17)
回答No.1

最初にclass1::pとclass2::q(ポインタのポインタが指している先)がまだ不定なのにnew int[n]でアドレスをセットしているように見受けられますけど? pとqの値(アドレス)によってはフリーズしちゃうと思います。 ためしてないけど。。。

1025
質問者

補足

どうすればよいですか?

関連するQ&A

  • new演算子のオーバーロードについて

    #include <stdio.h> #include <windows.h> class MyNew { public: void* ptr; MyNew( void* p ) { ptr = p; } void* MyNew::operator new( size_t size ) { printf("new-\n"); return malloc( size ); } void MyNew::operator delete( void* ptr ) { printf("delete-\n"); free( ptr ); } }; void main( void ) { MyNew p = new int; } クラスのメモリ確保をnew演算子のオーバーロードを用いて書いてみたのですがオーバーロードしたnew演算子が呼ばれません。 なぜでしょうか? /** VisualStdio2005コンソールアプリケーション WindowsXP */

  • 初心者です。 配列のエラーがどうしても解決できません。 誰か助けてください・・・

    魔方陣のプログラムを考えて書いてみましたが、 エラーが出てしまい実行することができません。 class mahoujin{ public static void main(String args[]){ int n=3; int a[][] = new int[3][3]; int x=0; int y=1; for(int p=0;p<=3;p++){ for(int q=0;q<=3;q++){ a[p][q]=0;} } for(int i=1;i<=n*n;i++){ if((i%n)==1){x++; }else{x--; y++;} if(x==0){x=3;} if(y==3){y=0;} a[x][y]=i;} } } 空の配列や配列を外れるものがあるかをよく考えてみましたが、どうしても解決できません。助けてください・・・

  • 動的配列を宣言するためにnew演算子とdelete演算子を用いる方法が

    動的配列を宣言するためにnew演算子とdelete演算子を用いる方法があります。 2次元配列は以下のように宣言して作れるのは分かったのですが、 (実際に使って動かしてみました。) int **pp; pp = new int*[ROW]; // 行を作る for(int i = 0; i < ROW; i++) // 列を作る pp[i] = new int[COL]; http://www.asahi-net.or.jp/~uc3k-ymd/Lesson/Section02/section02_07.html(引用) 3次元配列をどのように作ったらいいか分かりません。 教えてください。宜しくお願いします。

  • 実行時型情報を、newの引数にする?

    // 各クラスにはoperator=が定義されている class figure{...}; class circle : public figure{...}; class poly : public figure{...}; class rectangle : public poly{...}; ... void copy(figure** src,figure** dst,int n) { // ここでsrcの各項目の指す実体をコピーして、そのアドレスを  // dstに格納したいのですが、 for(int i=0;i<n;++i){ dst[i] = new (ここはどう決めるのでしょうか?) *dst[i] = *src[i]; } } int main() { const int nfig = 10; ... figure* s[nfig]; s[0] = new circle; s[1] = new rectangle; ... .... figure* d[nfig]; copy(s,d,nfig); .... } よろしくおねがいします。

  • コードの解説をお願い致します。

    「わかりやすいjavaオブジェクト指向編 P212 練習9-1 3」より 【問題文】 次のクラスがある。ToolクラスのサブクラスとしてmyToolクラスの 中にclearメソッドをオーバーロードしなさい。 package ex_9_1_4; class Tool{ public void clear(int[] n){ for(int i=0; i<n.length; i++){ n[i] = 0; } } } class myTool extends Tool{ } public class Exec { public static void main(String[] args) { int[]n   = { 3,5,9 }; int[][]m  = { { 3,2 }, { 9,4,2 } }; myTool t  = new myTool(); t.clear(n); t.clear(m);  } } 【正解】 public void clear(int[][] n){ for(int i=0; i<n.length; i++){ clear(n[i]); //1次元配列のクリア } } 【解説】 1次元配列のクリアには継承した親クラスのメソッドを利用する。 または、2重forループを書いてその中で配列をクリアしても構わない。 クラスToolのメソッドは理解出来ています。 クラスMyToolのメッソドの意味がさっぱり分かりません。 (1)正解のメソッドの解説をして頂けないでしょうか。 (2)2重forループの方法でも構いません。 (3)ゼロでクリアした配列要素を全て表示するコードを  追加したいのですが、どのように書けばいいのでしょうか。 よろしくお願い致します。

    • ベストアンサー
    • Java
  • new演算子と初期化子 { } の違いについて教えて下さい

    演算子と初期化子 { } の違いがわからなくて調べています。 // newを使った配列 int[] a = new int[3]; a[0] = 1; a[1] = 2; a[2] = 3; // { } を使った配列 int[] a = { 1, 2, 3 }; /* 上記の例は配列ですが、 例えば、配列ではない、Kamokuというクラスを作ったときに、 { } でコンストラクタを使用して、インスタンスを作ることは不可能ですか?メモリは確保しないのでしょうか?

    • ベストアンサー
    • Java
  • クラス内にnewで形成した配列等が含まれる場合

    クラスを関数内に作成した時にそれを実体コピーさせるreturnで返したいんですが、class内newで形成した動的配列があるため、返した後デストラクタが呼ばれるので動的配列の中身が消滅してしまう(させている)のですが、動的配列の消去にデストラクタを使用しないようにするしかありませんか? class a{ public: int *b; a(){b=new int[10];} ~a(){delete b;} //エラー原因 a operator+(a &s){a c;c.b[0] = b[0] + s.b[0];return c;} }; void main() {a x,y;y = x + x;}

  • newで個別に生成した配列にNULLを代入しても大丈夫か

    C++にて要素数が不定の配列のクラスをnewで生成します。 このとき、newで一度に全ての配列を生成するとメモリをかなり取るので、 指定された要素番号のみを生成したいのでダブルポインタにし、 全体を生成してから個別にクラスを生成することで、 思い通りの処理ができるようになりました。 (生成する番号は0→1→2みたいな順列ではないため) しかし、ここで1つ問題が発生しました。 まずは以下にそのソースを示します。 ----------------------------- class CHOGE {   int a; public:   CHOGE(){ a=999; }   void print(){ cout<<a<<endl; } }; ----------------------------- void main(){   CHOGE **p = new CHOGE*[3];   if( p[0] != NULL ){ // ←条件を通過してしまう     cout << "ほげ~" << endl; // ←表示される     //p[0]->print(); // ←当然エラー   }   p[0] = new CHOGE();   p[0]->print(); // ←OK   delete p[0];   p[0] = NULL;   delete [] p;   p = NULL; } ----------------------------- 上記は3個の要素の配列を生成してから、 個別に0番目の要素のインスタンスを生成しています。 しかし、上記main関数の3行目では、 インスタンスはまだ生成していなにもかかわらず NULLチェックを通り過ぎてしまいます。 そこで上記main関数の2行目に  for(int i=0; i<3; i++) p[i] = NULL; という処理を入れると期待通りに動いてくれるのですが、 どうも引っかかるといいますか、何かの情報を消してしまったり やってはいけないことをやってそうで、不安なのです・・・。 上記のようなとき、NULLを代入しても大丈夫なのでしょうか?

  • new演算子でメモリを確保したが、値が格納されなかった配列の…

    new演算子でメモリを確保したが、 値が格納されなかった配列の判別方法は ありますでしょうか? int i; int* a; a = new int[5]; a[0] = 0; a[1] = 1; a[5] = 5; //0,1,5のみ表示させたい for (i = 0; i < 6; i++) { if (?????) cout << a[i] << endl; }

  • newとdelete

    動的にaaa[5][40]という配列を作りたいのですけど,以下のプログラムでよろしいでしょうか? aaa = new double *[5]; for(int p = 0; p < 5; p++){ aaa[p] = new double [40]; } また,これをdeleteするときはどのようにすればよろしいのでしょうか? どうぞよろしくお願いいたします.