C++においてのメモリ割り当てと開放に関するメモ。
new と delete について
C++では new演算子 を使用しメモリを割り当て、 delete演算子 で開放する。
-
コードサンプル(コンストラクタなし)
-
[code]
#include
using namespace std;class Sample {
int a, b;
public:
void set_val(int x, int y) { a = x, b = y; }
int get_sum() { return a + b; }
};int main(int argc, const char * argv[])
{
Sample* s = new Sample; // オブジェクトを生成(メモリ割り当て)int num1, num2;
cout << "1つめの整数を入力 : "; cin >> num1;
cout << "2つめの整数を入力 : "; cin >> num2;s->set_val( num1, num2 );
cout << "合計 : " << s->get_sum();
delete s; // メモリ開放
return 0;
}
[/code] - 結果
-
[code]
1つめの整数を入力 : 1
2つめの整数を入力 : 2
合計 : 3
[/code]
-
コードサンプル(コンストラクタあり)
-
new演算子で動的に割り当てたオブジェクトに初期値を与える。
[code]
#include
using namespace std;class Sample {
int a, b;
public:
Sample(int x, int y) { a = x, b = y; }
int get_sum() { return a + b; }
};int main(int argc, const char * argv[])
{
int num1, num2;cout << "1つめの整数を入力 : "; cin >> num1;
cout << "2つめの整数を入力 : "; cin >> num2;Sample* s = new Sample(num1, num2); // オブジェクトを生成し初期化(メモリ割り当て)
cout << "合計 : " << s->get_sum();
delete s; // メモリ開放
return 0;
}
[/code] - 結果
-
[code]
1つめの整数を入力 : 10
2つめの整数を入力 : 100
合計 : 110
[/code]
-
コードサンプル(動的配列を作成しデストラクタを呼ぶ)
-
- 配列の動的割り当てと開放の構文
-
1次元配列の割り当て ポインタ = new 型 [サイズ]; 1次元配列の開放 delete [] ポインタ;
[code]
#include
using namespace std;class Sample {
int a, b;public:
void set_val(int x, int y) { a = x; b = y; }
~Sample() { cout << "デストラクタ\n"; } int get_sum() { return a + b; } }; int main(int argc, const char * argv[]) { int i; Sample* s = new Sample [5]; // オブジェクトの動的配列の割り当て for ( i=0; i<5 ; i++) { s[i].set_val(i, i); } for (i=0; i<5; i++) { cout << "[" << i << "] " << i << "+" << i << "= " << s[i].get_sum() << "\n"; } delete [] s; // オブジェクト配列の開放 return 0; } [/code] - 結果
-
[code]
[0] 0+0= 0
[1] 1+1= 2
[2] 2+2= 4
[3] 3+3= 6
[4] 4+4= 8
デストラクタ
デストラクタ
デストラクタ
デストラクタ
デストラクタ
[/code]
オブジェクト配列を開放すると、要素ごとにデストラクタが呼び出されるが、オブジェクト自身は1回しか開放されない。
まとめ
標準C++ではメモリ割り当てが失敗した場合は NULL ではなく、例外が生成される。
エラー処理や例外処理についてはまた後日。