MENU
コンテンツ再構築中

C++:メモリの割り当てと開放 new と delete について

C++においてのメモリ割り当てと開放に関するメモ。

INDEX

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 ではなく、例外が生成される。
エラー処理や例外処理についてはまた後日。

Please share it!
  • URLをコピーしました!
  • URLをコピーしました!
INDEX