のように使います。2番目の使い方は「データ型」で示した 領域を「個数」分だけ確保します。失敗したときは0を返します。 成功した場合は、確保した領域の先頭のアドレスを返します。 使い終わったら、delete演算子で解放します。 では、具体例を見てみましょう。new データ型 new データ型[個数]
まずは確保したい領域のデータ型へのポインタを宣言します。 次に
のようにして、領域を確保します。 使用が終わったら忘れずにdeleteします。ptr = new int[n];
このように、ptrが配列を指している場合は空の[]をptr の前に付けます。delete [] ptr;
左の例のように、実行時てないとデータの個数が
わからないような例の時は便利ですね。
まず、データの個数を入力します。 その個数文だけ入力を求めてくるので int型の整数を入力します。 そうすると、今入力したデータをそのまま 画面に出力するというものです。
初めに、データの個数がわからず、
データ入力で終わりを示す特定の文字
(たとえばE)を入力したらデータ入力が
終わるように書き換えてみてください。
さて、このnew演算子は、自分で定義したクラスでも利用できます。 もちろん、メンバ関数の中でも使えます。
これは、ごく簡単な例です。 次に少し複雑な例を示します。#include <iostream.h> class Test { public: int a; Test(){a = 10;}; }; int main(void) { Test *x; x = new Test; cout << x->a << endl; delete x; return 0; }
これは、コンストラクタで引数で与えられた 文字列を格納している例です。 問題は、デストラクタでdeleteしている点にあります。 よく例に出される問題ですが、上のプログラムで#include <iostream.h> #include <string.h> class Moji { public: char *str; Moji(const char *s); ~Moji(); void show(); }; Moji::Moji(const char *s) { int n; n = strlen(s); str = new char[n + 1]; strcpy(str, s); } Moji::~Moji() { cout << str << " delete!" << endl; delete [] str; } void Moji::show(void) { cout << "str = " << str << '\n'; return; } int main(void) { Moji Kumei("粂井"); Moji Tanaka("田中一郎"); Moji Sato("佐藤"); Kumei.show(); Tanaka.show(); Sato.show(); cout << endl; cout << "Kumei.str = " << Kumei.str << endl; cout << "Tanaka.str = " << Tanaka.str << endl; cout << "Sato.str = " << Sato.str << endl; cout << endl; return 0; }
Kumei = Tanaka;
としたらどうでしょうか。メンバごとに代入が
起こりますのでKumei.strとTanaka.strがメモリ上の
同じ位置を指すことになります。
そして、デストラクタが呼ばれると同じポインタを
削除しようとしてまずいことが起こります。
そして、その結果は予測不能です。
Update Jan/18/1997 By Y.Kumei