第15章 newとdelete演算子


Cでは、動的にメモリを確保する場合 mallocとか、calloc関数を 使いました。C++ではnewという演算子を使います。

new データ型 new データ型[個数]

のように使います。2番目の使い方は「データ型」で示した 領域を「個数」分だけ確保します。失敗したときは0を返します。 成功した場合は、確保した領域の先頭のアドレスを返します。 使い終わったら、delete演算子で解放します。 では、具体例を見てみましょう。

まずは確保したい領域のデータ型へのポインタを宣言します。 次に

ptr = new int[n];

のようにして、領域を確保します。 使用が終わったら忘れずにdeleteします。

delete [] ptr;

このように、ptrが配列を指している場合は空の[]を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; }

これは、ごく簡単な例です。 次に少し複雑な例を示します。

#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; }

これは、コンストラクタで引数で与えられた 文字列を格納している例です。 問題は、デストラクタでdeleteしている点にあります。 よく例に出される問題ですが、上のプログラムで

Kumei = Tanaka;

としたらどうでしょうか。メンバごとに代入が 起こりますのでKumei.strとTanaka.strがメモリ上の 同じ位置を指すことになります。 そして、デストラクタが呼ばれると同じポインタを 削除しようとしてまずいことが起こります。 そして、その結果は予測不能です。


[C++Index] [総合Index] [Previous Chapter] [Next Chapter]

Update Jan/18/1997 By Y.Kumei
当ホーム・ページの一部または全部を無断で複写、複製、 転載あるいはコンピュータ等のファイルに保存することを禁じます。