// ( r22.C ) // メモリ領域の管理について // #include // 原則:new 関数で確保したメモリは、プログラマが責任を // 持って delete 関数で解放してやらなければならな class Point { // い。そうしなければ、プログラムが終了してもメモ int color ; // リは自動的には解放されない。 public: Point() { color = 7 ; } Point( int c ) { color = c ; } ~Point() { color = 0 ; } void show() { cout << color << endl ; } } ; main() { // 例題1 int* p = new int[2] ; if ( !p ) { cout << "メモリ−を確保できません\n" ; } else { cout << "メモリ−を確保しました\n" ; } delete [2]p ; // 例題2 Point* p1 = new Point(2) ; Point* p2 = new Point(3) ; delete p1,p2 ; // p1 しか消去されない。delete p1; delete p2; と p1->show(); // 0 // 分けて記述すること。 p2->show(); // 3 delete p2 ; p2->show() ; // 0 // 例題3 注意:例題4のやり方よりも、こっちの方がいい! Point* v[2] ; // 例題4では値の初期設定ができない。 v[0] = new Point(2) ; v[1] = new Point(3) ; delete v[0] ; // delete v や delete [2]v では両方とも消えない! delete v[1] ; v[0]->show() ; v[1]->show() ; // 例題4 Point* s = new Point[2] ; // Point に引数無しのコンストラクタ Point() がな s[0].show() ; // 7 // いと、Point* s = new Point[2] 定義はできない。 s[1].show() ; // 7 // または s->show(); s++; s->show(); delete [2]s ; // delete s では s[1] が消えない。 } /* [参考] メモリ領域の種類 静的領域 → 外部変数や静的変数 スタック領域→ 自動変数、関数の引数 ヒ−プ領域 → new,malloc で動的に確保する領域 [注意] new 関数はインスタンス(オブジェクト)を動的に生成するために使用するものである。 例えばデ−タをリスト形式で作成していくような場合に使うのが一般的である。これ以 外で new 関数を使うのは、可変長の文字列を生成する場合ぐらいのもので、普通ただ配 列を確保するために new を使ったりはしない。 new のもう1つの働きは、メモリ領域をちゃんと確保できたかどうか、関数の返り値で 判断できることである。これをうまく使うと大きな配列を取った場合に起きる、コンパイ ル・エラ−のスタック・オ−バ−フロ−を避けることもできる??。 */