- ベストアンサー
オブジェクトの生成やメモリの削除について
class X{ ........ ........ ........ } に対し、 X *a=new X;//--------------1 ... ... ... a=new X;//----------------2 としてdeleteせずにnewをした場合、1の段階で作ったオブジェクトは削除されずメモリに残りっぱなしになるのでしょうか? これは、プログラムを終了しても残り続けるものなのでしょうか? また、mallocやcallocの場合はどうなるのでしょうか?
- coronalith
- お礼率82% (87/106)
- C・C++・C#
- 回答数2
- ありがとう数2
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
残ります。 終了時には解放されますが、デストラクタは呼ばれません。
その他の回答 (1)
- Tasuke22
- ベストアンサー率33% (1799/5383)
mallocやcallocはOSによって挙動が違ったと 思います。 オブジェクトの生成に対して削除をしない場 合、その変数が何かによって、オブジェクト 領域の寿命が変わります。 「スコープ」を勉強してください。
お礼
どうも有り難うございました。
関連するQ&A
- オブジェクト生成によるメモリ確保
int b; とやるとメモリ上で4バイト、つまりメモリセルが32個が確保されます。 それでは class A というものがあって、 A a=new A(); とオブジェクトを作るとメモリ上には何バイト確保されるのでしょうか?
- ベストアンサー
- Java
- newしないオブジェクトについて
C++で オブジェクト生成時、NEW しない場合、 どこにメモリ領域が作られているのでしょうか? また、newはmallocと同じで、動的にメモリを確保ということはわかるのですが、 では、newしない場合、静的ということになるのでしょうか? そうだとすると、静的なオブジェクトとは一体どのようなものをいうのでしょうか? よろしくおねがいします。
- ベストアンサー
- C・C++・C#
- C++でのクラスオブジェクトの破棄
こんにちは。 C++では、プログラムの終了時に、全てのクラスオブジェクトは、デストラクタが呼び出されて破棄されますが、プログラムの途中で、クラスオブジェクトを明示的に破棄する方法はあるのでしょうか? 例えば、new演算子によってメモリを動的に割り当てたポインタなら、delete演算子で破棄できますが、 クラスオブジェクトにdelete演算子は使えないようです。 何かいい方法を知っておられる方がいらっしゃれば、是非アドバイスを頂きたいと思います。
- ベストアンサー
- C・C++・C#
- メモリを解放しないとどうなる?
趣味でプログラムの勉強をしています。 初歩的な質問になると思いますが、よろしくお願いします。 C言語やC++言語のように、動的に確保したメモリを使用後に意識して解放しないといけない言語で、解放の処理をしないままプログラム(アプリケーション)を終了した場合にはシステム(OS?)的にはどのような状態になるのでしょうか? 例: ・malloc して free しない ・new して delete しない 確保されたメモリ領域がそのまま残り、システムとして使用できるメモリ量が減る(解放にはPCの再起動が必要)のでしょうか? それともアプリケーションの終了時に自動的に解放されるのでしょうか? Windowsの場合を想定してご回答いただだけると嬉しいです。
- ベストアンサー
- その他(プログラミング・開発)
- オブジェクトのコピー
以下のプログラムはVC++6.0(win2k上)で、 オブジェクトのコピーを練習するために書いたものです。 このプログラムは、コンパイルは通りますが、 実行エラーになります。どのように変更すればよいでしょうか? #include <iostream> #include <stdio.h> #include <assert.h> using namespace std; class Player{ int data; Player *p; public: Player(); ~Player(); Player(const Player & x); void SetData(int d){ data = d; } int GetData(){ return data; } //代入演算子 Player & operator=(const Player & x); }; Player & Player::operator = (const Player & x){ p = new Player; //Playerオブジェクトを別の場所に作る *p = *(x.p); //pの指すオブジェクトに、mのpが指すオブジェクトを代入 return *this; } Player::Player(const Player& x){ p = new Player; //Playerオブジェクトを別の場所に作る *p = *(x.p); //pの指すオブジェクトに、mのpが指すオブジェクトを代入 } class App { Player *p[3]; public: App(); ~App(){for(int i=0;i<3;i++)delete p[i];} //pの指すオブジェクトのデータを設定するだけ void SetData(int i1,int i2){ p[i1]->SetData(i2); } void init(){p[0]=new Player;p[1]=new Player;p[2]=new Player;} void copy(){p[0]=p[1];SetData(0,100);} void output(){ for(int i=0;i<3;i++)printf("%d\n",p[i]->GetData()); } }; void main() { App *x=new App; x->init(); for(int i=0;i<3;i++)x->SetData(i,i); x->copy(); x->output(); delete x; }
- ベストアンサー
- C・C++・C#
- 【C++】オブジェクト配列の動的確保
Objectがクラスとして、以下のようなプログラムを書きました Object **obj; obj = new Object*[100]; for(i=0;i<100;i++){ obj[i] = new Object(a,b,c); obj[i]->Run(); delete obj[i]; } delete [] obj; するとdeleteの所でエラーになります。 (確保していない領域をdeleteしようとしたときのような) 何か間違っているのでしょうか。 何故かデバッガでは通ってしまいます。 環境:XP、VisualStudio2005 何卒よろしくお願いいたします。
- ベストアンサー
- C・C++・C#
- C++ オブジェクトポインタのメリット
以下の例のように、あるオブジェクトが別のオブジェクトのメンバ関数にアクセスする時、ポインタを使うメリットはあるのでしょうか? ご助言いただきたいです。 よろしくお願いします。 ↓例 オブジェクトAのaaa関数からオブジェクトBのbbb関数にアクセスしてHello!を表示する。 #include <stdio.h> class B { public: void bbb(void); }; class A { public: void SetBObj(B* objB); void aaa(void); private: B* mem_objB; }; int main(void) { A* objA = new A(); B* objB = new B(); objA->SetBObj(objB); objA->aaa(); delete new A(); delete new B(); return 0; } void A::SetBObj(B* objB) { mem_objB = objB; } void A::aaa(void) { mem_objB->bbb(); } void B::bbb(void) { printf("Hello!\n"); }
- 締切済み
- C・C++・C#
- オブジェクト作成方法の違い
C++の勉強中でいろんなサイトを見ていたのですが、 オブジェクトとの作成方法にnewを指定しているときと 指定していないときの違いが分かりませんでした。 あと、newで作成された場合は動的にメモリを確保して deleteする必要がありますが、newされていない方は deleteする必要はないんでしょうか? パターン1 TestClass test("Hello"); パターン2 TestClass *test = new TestClass("Hello");
- ベストアンサー
- C・C++・C#
- C#でオブジェクトが生成されるたびに加算される変数
タイトルの通りなのですがどうも上手く行かなくて・・・ まず、これが今作ってる、立方体の定義のためのクラスです class cube { public point a = new point(); public point b = new point(); public point c = new point(); public point d = new point(); public point A = new point(); public point B = new point(); public point C = new point(); public point D = new point(); } (point は x,y,zの値を持つ別のクラスです) ここで、それぞれのpoint(頂点)を生成した分だけ、それぞれのオブジェクトに、その通し番号を持たせることは出来ないでしょうか、つまり、最終的にそれぞれのオブジェクトが それぞれのクラスのメンバ変数 ”通し番号” を定義したとして a.通し番号 が 1 b.通し番号 が 2 c. 通し番号 が 3 という感じになるようにしたいんですが出来ません・・・ 外部にstaticな変数をおいてどうにかしようと思いましたが、staticなので、最後の通し番号に上書きされてしまって個別のオブジェクト内に保持できません むしろstatic変数ののある時点での実態コピーが出来るならそれも教えて下さい、それでもこの問題は解決します よろしくお願いします
- ベストアンサー
- C・C++・C#
お礼
C++は残るのですか、どうも有り難うございました。