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

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

new と delete について

C++では new演算子 を使用しメモリを割り当て、 delete演算子 で開放する。

コードサンプル(コンストラクタなし)

#include <iostream>
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;
}
結果
1つめの整数を入力 : 1
2つめの整数を入力 : 2
合計 : 3

コードサンプル(コンストラクタあり)

new演算子で動的に割り当てたオブジェクトに初期値を与える。

#include <iostream>
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;
}
結果
1つめの整数を入力 : 10
2つめの整数を入力 : 100
合計 : 110

コードサンプル(動的配列を作成しデストラクタを呼ぶ)

配列の動的割り当てと開放の構文
1次元配列の割り当て ポインタ = new 型 [サイズ];
1次元配列の開放 delete [] ポインタ;
#include <iostream>
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]
</dd>
<dt>結果</dt>
<dd>
[code]
[0] 0+0= 0
[1] 1+1= 2
[2] 2+2= 4
[3] 3+3= 6
[4] 4+4= 8
デストラクタ
デストラクタ
デストラクタ
デストラクタ
デストラクタ

オブジェクト配列を開放すると、要素ごとにデストラクタが呼び出されるが、オブジェクト自身は1回しか開放されない。

まとめ

標準C++ではメモリ割り当てが失敗した場合は NULL ではなく、例外が生成される。
エラー処理や例外処理についてはまた後日。

siro:chro 無料ゲーム SQN をリリースしました

img_sqn_00

sirochro 初の無料ゲームアプリ SQN をリリースしました。
記事:SQN: iOS 無料ゲームアプリ SQN - Sequential Numbers をリリース
ちょっとした時間に楽しめる完全無料のゲームなっていますので、是非ダウンロードして遊んでみてください。

↓SQN のダウンロードはこちらから

Related Contents

Pickup Contents