1. ホーム
  2. c++

[解決済み] 動的に割り当てられた2次元配列の削除 [重複]について

2022-03-02 18:28:39

質問

だから、私はC言語のメモリ管理には慣れていて、そこで free(pointer) が指すすべての領域を解放します。 pointer . 今、私はC++で簡単なことをやろうとして、自分自身を混乱させている。

2次元のdouble配列がこのような方法で割り当てられているとします。

double** atoms = new double*[1000];
for(int i = 0; i < 1000; i++)
  atoms[i] = new double[4];

new で確保されたヒープ上のメモリを解放する正しい方法は何でしょうか?

私の考えは元々こうでした(脳がC言語で考えていたので)。

for(int i = 0; i < 1000; i++)
  delete atoms[i];
delete atoms;

しかし、私はその存在を忘れていました。 delete[] 演算子を使うので、正しい方法は次のようになると思います。

for(int i = 0; i < 1000; i++)
  delete[] atoms[i];
delete[] atoms;

の違いを理解することが重要なのでしょうか? deletedelete[] 演算子を使用することができますか?それとも、配列の確保に ptr = new x[] を使用する必要があります。 delete[] ptr ?

解決方法は?

現実には、ポインタが指す配列は、やはりメモリアドレスを保持するための整数型データ型や数値の配列です。を使用する必要があります。 delete[] のどちらにも対応します。

また、そうです。 new[] を意味します。 delete[] .

配列の配列を作成するとき、実際には 数値の配列 のメモリアドレスを保持し、それがたまたま 数値の配列 . とはいえ、どちらも数字の配列ですから、両方とも delete[] .

http://coliru.stacked-crooked.com/a/8a625b672b66f6ce

#include <iostream>

int main() {

    //Hey, pointers have a finite size, no matter the indirection level!
    std::cout << "sizeof(int*): " << sizeof(int*) << std::endl;
    std::cout << "sizeof(int**): " << sizeof(int**) << std::endl;
    std::cout << "sizeof(int***): " << sizeof(int***) << std::endl;

    //Create an array of pointers that points to more arrays
    int** matrix = new int*[5];
    for (int i = 0; i < 5; ++i) {
        matrix[i] = new int[5];
        for (int j = 0; j < 5; ++j) {
            matrix[i][j] = i*5 + j;
        }
    }

    //Print out the matrix to verify we have created the matrix
    for (int j = 0; j < 5; ++j) {
        for (int i = 0; i < 5; ++i) {
            std::cout << matrix[j][i] << std::endl;
        }
    }

    //Free each sub-array
    for(int i = 0; i < 5; ++i) {
        delete[] matrix[i];   
    }
    //Free the array of pointers
    delete[] matrix;

    return 0;
}