(C++) for文内でのインスタンス生成について

このQ&Aのポイント
  • for文内でのインスタンス生成についての質問です。同じメモリアドレスを参照したインスタンスが生成されてしまい、別の処理で一つのインスタンスに変更を加えるとすべてのインスタンスに変更がかかってしまいます。解決方法はありますか?
  • for文を使用してループさせながらインスタンスを生成すると、同じメモリアドレスを参照したインスタンスが生成されてしまいます。したがって、別の処理で一つのインスタンスに変更を加えると、すべてのインスタンスに変更がかかってしまいます。この問題を解決する方法はありますか?
  • for文を使用してループさせながらインスタンスを生成すると、同じメモリアドレスを参照したインスタンスが生成されてしまいます。これにより、別の処理で一つのインスタンスに変更を加えると、すべてのインスタンスに変更がかかってしまいます。この問題を解決するにはどうすればよいでしょうか?
回答を見る
  • ベストアンサー

(C++) for文内でのインスタンス生成について

はじめまして。 いつも色々と質問を読まさせて頂いています。 早速タイトルの質問についてですが、for文の中でループさせながらインスタンスを生成しようとしています。 for (int i=0; i<10; i++) { MyObject *obj = new MyObject(); int intX = new int(100); // メモリのアドレスを確認 printf("%p¥n", &obj); printf("%p¥n", &intX); } この結果、 0xbfffd7dc 0xbfffd7f0 0xbfffd7dc 0xbfffd7f0 0xbfffd7dc 0xbfffd7f0 0xbfffd7dc 0xbfffd7f0 . . のようになり、どうも同じメモリアドレスを参照したインスタンスが生成されているようです。 やりたい事は、10回のインスタンスの生成をforで手抜きして行いたいのですが、この方法ですとすべて同じインスタンスとなってしまい、 別の処理でとある一つのインスタンスに変更を加えると、すべてのインスタンスにも変更がかかってしまいます。 これを実現する方法はあるのでしょうか。 解決方法として、forを使わずに、 MyObject *obj1 = new MyObject(); MyObject *obj2 = new MyObject(); . . とやれば別アドレスの参照となることは分かったのですが。。。 初歩的な質問だと思いますが、お知恵をお借りできればと思います。 よろしくお願いします。

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

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

&obj だから、インスタンスじゃないです。MyObject *型の変数objが格納されているアドレスが出力されています。 newで生成されたインスタンスのアドレスなら obj です。 printf("%p¥n", &intX); こっちも同様に、int型の変数intXが格納されているアドレスです。 さらに、intはクラスでく只の値なので、インスタンスは作られません。 C/C++のメモリ関係は、他の高級言語に比べると、かなりCPU寄りです。 ポインタについて、もっと勉強するのがいいと思います。

chr001
質問者

お礼

kmeeさん、返信ありがとうございます。 >MyObject *型の変数objが格納されているアドレスが出力されています。 そうでした。。 ポインタ変数のアドレスでした。 >ポインタについて、もっと勉強するのがいいと思います。 はい、もっと勉強します。 ありがとうございます!

関連するQ&A

  • ダブルポインタで2次元配列を作成

    2次元配列を作り、そのアドレスなどを表示させましたが どうもおかしいです。 3行5列の配列で、3本のポインタ配列がありますが、 その配列のアドレスがかぶっているのです。 まずはコンパイルしてみてください。 #include<stdio.h> main() { int i; int k; int y=1; int **p; p=(int **)malloc(sizeof(int *)*3); for(i=0;i<=2;i++) { *(p+i)=(int *)malloc(sizeof(int)*5); } for(i=0;i<=2;i++){ for(k=0;k<=4;k++){ p[i][k]=(i+k)*y; } y=y*10; } for(i=0;i<=2;i++){ for(k=0;k<=4;k++){ printf("%4d",*(*(p+i)+k)); } printf("\n"); } printf("\n"); for(i=0;i<=2;i++) { printf("%p\n",p+i); } printf("\n"); for(i=0;i<=2;i++) { printf("%p\n",&p+i); } printf("\n"); for(i=0;i<=2;i++) { printf("%p\n",*(p+i)); } printf("\n"); for(i=0;i<=4;i++) { printf("%p\n",*(p)+i); } printf("\n"); for(i=0;i<=4;i++) { printf("%p\n",&*(p)+i); } printf("\n"); for(i=0;i<=4;i++) { printf("%p\n",&**(p)+i); } printf("\n"); for(i=0;i<=4;i++) { printf("%p\n",*(p+1)+i); } printf("\n"); for(i=0;i<=4;i++) { printf("%p\n",&*(p+1)+i); } printf("\n"); for(i=0;i<=4;i++) { printf("%p\n",&**(p+1)+i); } printf("\n"); for(i=0;i<=4;i++) { printf("%p\n",*(p+2)+i); } printf("\n"); for(i=0;i<=4;i++) { printf("%p\n",&*(p+2)+i); } printf("\n"); for(i=0;i<=4;i++) { printf("%p\n",&**(p+2)+i); } printf("\n"); for(i=0;i<=2;i++){ for(k=0;k<=4;k++){ printf("%p\n",&*(*(p+i)+k)); }} free(p); return 0; } どこがかぶっているかと申しますと、 for(i=0;i<=4;i++) { printf("%p\n",&*(p)+i); } と for(i=0;i<=4;i++) { printf("%p\n",&*(p+1)+i); } と for(i=0;i<=4;i++) { printf("%p\n",&*(p+2)+i); } です。 これが同じアドレスになるはずは論理的にありえないことです。 VC++2008無料バージョンです。 よろしくお願いいたします。

  • C言語

    #include <stdio.h> #include <stdib.h> int main (void){ double a[5]={0.0,4.0,0.0,-5.0,1.0}; double x; int i,j,k,n; n=4; x=0.75; for(i=1;i<=n;i++) printf("%10.5f ,",a[i]); printf("\n"); for (i=1; i<=n+1; i++) printf("----------") printf("\n"); while(n>=1){ for(i=1; i<=n; i++) a[i]=a[i-1]*x+a[i]; for(i=1; i<=n; i++) prontf("%10.5f ,"a[i]); printf("\n"); n=n-1; } return 0; }

  • CからVB

    以下のプログラムはC言語で作成されています。 これをVBで作成したいです。 教えてください。 #include <stdio.h> #include <stdlib.h> double *alloc(int r,int n,int m); void input(double *p,int r,int n,int m); void sumup(double *p,int r,int n,int m); int main(void){ int r, n, m; double *p; // 行列サイズ入力 printf("input r n m "); scanf("%d %d %d",&r,&n,&m); // 行列領域取得 p = alloc(r,n,m); // 行列要素入力 input(p,r,n,m); // 行列の和 sumup(p,r,n,m); //終了,行列領域解放 free(p); return 0; } double *alloc(int r,int n,int m){ double *p; printf("MATRIX[r=%d][n=%d][m=%d]\n\n",r,n,m); p = (double*)malloc(sizeof(double)*r*n*m); if( p == NULL){ printf("error! malloc failed.\n"); exit(-1); } return p; } void input(double *p,int r, int n,int m) { int i,j,k; for(i = 0; i < r; i++){ for(j = 0;j < n; j++){ for(k = 0; k < m; k++){ printf("input MATRIX[%d][%d][%d]= ",i,j,k); scanf("%lf",&p[i*(n*m)+j*m+k]); } } } printf("\n"); } // 行列の和 void sumup(double *p,int r,int n,int m){ int i, j, k; // 0.0, not 0!!! double sum = 0.0; printf("sum of %d matrices:\n",r); for(j = 0; j< n; j++){ for(k = 0;k < m; k++){ sum=0; for(i = 0;i < r;i++){ sum += p[i*(n*m)+j*m+k]; } printf("\n%2f",sum); } } printf("\n"); }

  • for文内でscanf関数により配列に数値を格納することについて

    プログラミング初心者です。 よろしくお願いします。 ◎1------------------------------------ #include<stdio.h> int main(void) { int i,dt[3]; for(i=0;i<3;++i){ printf("dt[0]=%d\n",dt[0]); printf("dt[1]=%d\n",dt[1]); printf("dt[3]=%d\n",dt[3]); scanf("%d",&dt[i]); printf("i=%d\n",i); puts(""); if(dt[i]==0){ break; } } printf("dt[0]=%d\n",dt[0]); printf("dt[1]=%d\n",dt[1]); printf("dt[2]=%d\n",dt[2]); printf("dt[3]=%d\n",dt[3]); printf("i=%d\n",i); puts(""); i=1; while(1){ printf("%d ",i); if(1000<i){ break; } i*=2; } puts(""); return 0; } ---------------------------------------- ◎2------------------------------------ #include<stdio.h> int main(void) { int i,dt[2]; for(i=0;i<3;++i){ printf("dt[0]=%d\n",dt[0]); printf("dt[1]=%d\n",dt[1]); printf("dt[2]=%d\n",dt[2]); scanf("%d",&dt[i]); printf("i=%d\n",i); puts(""); if(dt[i]==0){ break; } } printf("dt[0]=%d\n",dt[0]); printf("dt[1]=%d\n",dt[1]); printf("dt[2]=%d\n",dt[2]); printf("i=%d\n",i); puts(""); i=1; while(1){ printf("%d ",i); if(1000<i){ break; } i*=2; } puts(""); return 0; } ---------------------------------------- 以上2つのプログラムについて疑問があります。 まず◎1については、あえて添え字のdt[3]の値を見てみようと思ったら、iの値が入っているとわかりました。 しかし、何故添え字の番号の配列にiの値が入っているのかがわかりません。 次に◎2ですが、3回目のループで、添え字の番号の配列自身に入力した数値を格納すると、iと添え字番号配列に入力した数値が入っていました。 何故このようになっているのか疑問です。 以上のような疑問があります。 添え字の番号の配列とiが何か関連があるようですがいまいちわかりません。 教えていただけると嬉しいです。

  • for文

    #include <stdio.h> int main(void) { int i; int sum=0; int num, tmp; printf("整数は何個かな:"); scanf("%d",&num); for(i=0; i<num; i++){ printf("No.%d:",i+1); scanf("%d",&tmp); sum+=tmp; } printf("合計値は:%d\n",sum); printf("平均値は:%.2f\n", (double)sum/num); return(0); } 上の文のforの箇所を for(i=1; i<=num; i++){ printf("No.%d:",i); scanf("%d",&tmp); sum+=tmp;   } としても結果的に同じですよね? どっちでもいいかどうか迷ってます。教えて下さい。

  • VS2005 C#での質問です。

    VS2005 C#での質問です。 ミューテックスを使用しスレッドの重複起動を防ごうとしているのですが、ミューテックス取得時になぜか毎回取得出来てしまい重複起動を防げていません。 困り果てているのでどなたかご教示ください。 【サンプル】 ========== namespace c { public delegate void M_P(int num); public class Program { static public bool[] state = new bool[3]; static M mt = new M(); static void Main(string[] args) { M_P[] L_process = new M_P [3]; int i = 0; for (i = 0; i < 3; i++) { L_process[i] = new M_P(L_Run); //ミューテックス生成 mt.set(i); } while(true) { for (i = 0; i < 3; i++) { if (state[i]) { //ミューテックス取得 if (mt.get(i)) ★i=0のときは解放していないのに毎回trueになる。 { L_process[i].BeginInvoke(i, null, null); mt.keep(i); } } else { //ミューテックス開放 if (mt.get(i)) ★i=0のときは通らない { mt.release(i); } } } } } class M { public static Mutex[] mutex_obj = new Mutex[3]; public void set(int i) { try { //ミューテックス生成 mutex_obj[i] = new Mutex(false, "P_" + i); } catch { return; } } public bool get(int i) { //ミューテックス取得 return (mutex_obj[i].WaitOne(0, false)); } public void release(int i) { ////ミューテックス開放 mutex_obj[i].ReleaseMutex(); } public void keep(int i) { GC.KeepAlive(mutex_obj[i]); } } }

  • クラスとインスタンスについて

    はじめまして。Javaをはじめて3か月の超初心者です。 早速ではございますが、質問をさせていただきます。 以下のサンプルで、 class Foo { private int i = 0; Foo(int i) { this.i = i; } void func1() { System.out.println(this.i); } void func2(Foo foo) { System.out.println(foo.i); } } class Main { public static void main(String[] args) { Foo obj1 = new Foo(100); Foo obj2 = new Foo(500); obj1.func1(); obj1.func2(obj2); } } privateフィールドのスコープは同一クラス内からしか アクセスできないと参考書には記述されているの ですが、そのクラス内に上のサンプルのように this.iやfoo.iというように、クラスは同じでも インスタンスが異なるものがiにアクセスするとき、 上のサンプルは、どちらもアクセス制限のエラーが表 示されません。なぜなのでしょうか? this.iというアクセスは、現在実行中のインスタン ス内でのアクセスなので、privateスコープ内での アクセスであるというような感じがするのですが、 foo.iというアクセスの方は、現在実行中のインスタンスとは異なるインスタンス内でのアクセスなので、 privateスコープからはずれているような感じがして なりません。

    • ベストアンサー
    • Java
  • c言語について

    #include <stdio.h> MakeData(int *a,int n){ int i,b[5]={5,1,4,7,2}; for(i=0;i<5;i++){a[i]=b[i];} } BubbleSort(int n,int *a){ ここに流れ図に沿ったプログラムを作る } main(){ int i,n,a[100]; n=5; MakeData(a,n); for(i=0;i<n;i++){printf("%4d ",a[i]);}printf("¥n"); printf("並べ替え後¥n"); BubbleSort(n,a); for(i=0;i<n;i++){printf("%4d ",a[i]);}printf("¥n"); } この課題が分かりません。 もし詳しい方がいらっしゃいましたら教えて頂けると助かります。

  • for

    (1)*を1ずつ増やして表示していくにはどうしたら良いでしょうか。 (2)*を1づつ減らして表示していくにはどうしたらよいでしょうか。 int i; for(i=1; i<=9;i++){ printf("*\n"); ↓こんな感じに表示したんですが。 * ** *** **** **** *** ** *

  • for文

    for文なのですが、 scanfで得た、 iを for文のi--で、一づつへらしてますが、 0でfor文がおわりますが 0で終わりの記述がない気がするんですが、 どうしてでしょか? int main(void) {    int i;    printf("正の整数を入力してください。\n");    scanf("%d",&i);    for( ; i ; i--)    printf("qが入力されました。\n");    return 0; }

専門家に質問してみよう