©️

C++ 動的メモリ(new, delete)

2024/10/04に公開
2

C言語とC++の動的メモリ確保・解放の違い

Cでmalloc, freeを使って行っていた動的メモリ確保・解放を、C++ではnew, deleteを使って行うことができる

new, deleteを使ったサンプルコード

#include <iostream>

int main() {
    // 整数型のメモリをヒープに動的確保
    int* pNumber = new int;   // newを使って整数型のメモリを動的に確保
    *pNumber = 42;            // ポインタを使って値を代入

    std::cout << "Number: " << *pNumber << std::endl;   // 動的に確保した値の表示

    // メモリを解放
    delete pNumber;   // deleteを使って確保したメモリを解放

    // 配列のメモリを動的確保
    int* pArray = new int[5];   // newを使って整数型配列のメモリを動的に確保

    // 配列に値を代入
    for (int i = 0; i < 5; ++i) {
        pArray[i] = i * 10;
    }

    // 配列の内容を表示
    std::cout << "Array contents: ";
    for (int i = 0; i < 5; ++i) {
        std::cout << pArray[i] << " ";
    }
    std::cout << std::endl;

    // 配列のメモリを解放
    delete[] pArray;   // delete[]を使って配列メモリを解放

    return 0;
}

多次元配列の動的メモリ確保・解放

int (*pArray1)[6] = new int[5][6];
delete[] pArray1;

// または
auto pArray2 = new int[5][6];
delete[] pArray2;

Discussion

齊藤敦志齊藤敦志

new で多次元配列の動的確保はできない

int** pArray = new int[5][6]; // エラー

これは変数の型と初期化子の型が合っていない故のエラーであって動的確保に失敗するというエラーではないです。

型を合わせれば問題ありません。

int (*pArray)[6] = new int[5][6];

面倒くさければ auto (によって推論させる) でもよいでしょう。

auto pArray = new int[5][6];