【C++】【基礎】メモリ割り当て・解放について

先日のブログより、今回はメモリ確保、解放処理についてメモしておこうと思います。

メモリを確保する方法

ポインタへメモリを割り当てる方法は基本的に


ポインタ = new ポインタの型;


このような処理で指定した型のサイズ分のメモリを確保することができます。

メモリを開放する方法

確保したメモリの領域を解放する方法は


delete ポインタ;


このような処理で指定したポインタに割り当てられているメモリを開放することができます。

例一覧

例1)int型ポインタのメモリ確保・解放


int* p;
p = new int;	// int型(4バイト)分のメモリ確保

delete p;       // メモリ解放


例2)int型配列のメモリ確保・解放


int* array;
array = new int[5];     // 20バイト(int型4バイト x5)分のメモリ確保

delete[] array;         // メモリ解放


配列に割り当てたメモリを開放する際はdelete[]を使用します。

例3)int型配列を"格納するポインタ"(ポインタ配列)の場合


// ポインタを格納するための配列(ポインタ配列)
int* pArray[5];	// ここではメモリ確保はされていない

//初期化処理
for (int i = 0; i < 5; i++)
{
    pArray[i] = new int;    // 4バイトずつメモリ確保し、配列に格納
}

// メモリ解放処理
for (int i = 0; i < 5; i++)
{
    delete pArray[i];       // 配列の要素1つずつメモリを解放
}


すべてのコード


int main()
{
    // メモリ確保処理

    int* p;
    p = new int;                // int型(4バイト)分のメモリ確保
    

    int* array;
    array = new int[5];         // 20バイト(int型4バイト x5)分のメモリ確保

    // 初期化処理
    for (int i = 0; i < 5; i++)
    {
        array[i] = 0;
    }


    // ポインタを格納するための配列(ポインタ配列)
    int* pArray[5];	        // ここではメモリ確保はされていない 

    //初期化処理
    for (int i = 0; i < 5; i++)
    {
        pArray[i] = new int;	// 4バイトずつメモリ確保し、配列に格納
    }   


    // メモリ解放処理

    delete p;

    delete[] array; 

    for (int i = 0; i < 5; i++)
    {
    	delete pArray[i];       // 配列の要素1つずつメモリを解放
    }   

    return 0;
}

さいごに

メモリ解放処理を忘れてしまうとメモリリークが発生してしまい、バグの温床、最悪の場合PCのフリーズなどを引き起こしてしまうため、 絶対に忘れてはいけません。

メモリリークが起きているかどうかを調べてくれるツールもあるので、そちらも活用してみるのもいいでしょう。

↓ブログ記事
CRTライブラリを使用してメモリリークを検出する方法

2024/09/03

ブログ記事一覧に戻る