C++ での 2D 配列の割り当て解除

Saad Aslam 2023年10月12日
  1. C++ での 2D 配列の初期化
  2. C++ で delete 演算子を使用して 2D 配列の割り当てを解除する
  3. malloc() および free() 演算子を使用して C++ で 2D 配列の割り当てを解除する
C++ での 2D 配列の割り当て解除

この記事では、C++ プログラミング言語で 2 次元配列を初期化および解放する方法について説明します。

C++ で作成できる多次元配列の最も基本的なバージョンは 2 次元配列です。 matrix は 2 次元配列の別名です。 初期化方法に応じて、整数、文字、浮動小数点数など、任意の型にすることができます。

C++ の new 演算子は、2 次元配列の動的な割り当てを有効にしますが、delete 演算子は、配列が使用されると、その後の配列の割り当て解除を有効にします。 new 演算子を使用して 2 次元配列を割り当てる場合、いくつかの異なるアプローチを利用できます。

フリー ストアを使用して動的メモリが割り当てられると、作成されたオブジェクトへの参照を取得できます。 ただし、このポインタは、割り当てられた領域の最初のバイトを参照します。

C++ での 2D 配列の初期化

まず、5 行 2 列の arr という 2 次元配列を使用して、配列の配列を作成します。

int arr[5][2] = {
    {11, 12}, {13, 14}, {10, 12}, {14, 16}, {15, 17},
}

以下は、5 行 2 列の 2 次元配列を作成するために使用できる別の方法です。

int arr[5][2] = {11, 12}

2 次元配列の初期化プロセスが完了しました。 ただし、まだ印刷していないため、操作が正しく行われたかどうかは確認できません。

#include <iostream>
using namespace std;

int main() {
  int arr[5][2] = {
      {11, 12}, {13, 14}, {10, 12}, {14, 16}, {15, 17},
  };
  int i, j;
  cout << "The array is shown as follows:\n" << endl;
  for (i = 0; i < 5; i++) {
    for (j = 0; j < 2; j++) {
      cout << arr[i][j] << "\t";
    }
    cout << endl;
  }
}

出力:

The array is shown as follows:

11      12
13      14
10      12
14      16
15      17

C++ で delete 演算子を使用して 2D 配列の割り当てを解除する

配列の割り当て解除は、C++ で最も重要な機能です。

動的に割り当てられた RAM を解放するには、プログラマの介入が必要です。 データ変数、ポインタ、または配列によって占有されているメモリ領域の割り当て解除または解放は、delete 演算子を使用して実行されます。

次の例では、配列のメモリの割り当てを解除しようとします。配列の最初の整数のみを 0 に設定し、残りはそのままにします。

プログラムの main() メソッド内で in というデータ型 int を持つ 2つの変数を宣言します。

int i, n;

ここで、格納する整数の総数について入力を収集します。

cout << "How many integers do you want to store?" << endl;
cin >> n;

ポインタを使用して pointerArray と呼ばれる int 型の配列を初期化します。

int* pointerArray = new int[n];

配列にいくつかの数値を入力できるように、ユーザーに何らかの入力を提供させます。 システムに保存したい整数の数に等しい値になるまで、繰り返し入力を受け入れる for ループを使用します。

for (int i = 0; i < n; i++) {
  cout << endl;
  cout << "Please input an integer\n";
  cin >> pointerArray[i];
}

現在配列に保持されている整数を出力します。 この目的のために、for ループを使用します。

cout << "Stored array values\n";

for (int i = 0; i < n; i++) {
  cout << pointerArray[i] << endl;
}

配列の割り当てを解除するには、まず delete[] 演算子を使用する必要があります。 もう一度、配列を出力して、効果的に割り当てが解除されたことを確認します。

cout << "Deallocating array\n";
delete[] pointerArray;

cout << "Print the array to check if the array is deallocated\n";
for (i = 0; i < n; i++) {
  cout << pointerArray[i] << endl;
}

完全なソース コード:

#include <iostream>
using namespace std;

int main() {
  int i, n;

  cout << "How many integers do you want to store?" << endl;
  cin >> n;

  int* pointerArray = new int[n];

  for (int i = 0; i < n; i++) {
    cout << endl;
    cout << "Please input an integer\n";
    cin >> pointerArray[i];
  }

  cout << "Stored array values\n";

  for (int i = 0; i < n; i++) {
    cout << pointerArray[i] << endl;
  }
  cout << "Deallocating array\n";
  delete[] pointerArray;

  cout << "Print the array to check if the array is deallocated\n";
  for (i = 0; i < n; i++) {
    cout << pointerArray[i] << endl;
  }
}

出力:

How many integers do you want to store?
2

Please input an integer
2

Please input an integer
3
Stored array values
2
3
Deallocating array
Print the array to check if the array is deallocated
0
0

malloc() および free() 演算子を使用して C++ で 2D 配列の割り当てを解除する

この例では、malloc() 関数を使用して、int メモリを 0 のサイズで newPointer ポインタに割り当てました。

int* newPointer = (int*)malloc(0);

その後、if ステートメントを使用して、malloc() がアドレスまたは null ポインターを提供したかどうかを判断します。 アドレスが生成された場合は、次のステップに進みます。

if (newPointer == NULL) {
  cout << "Null value";
} else {
  cout << "Address = " << newPointer;
}

最終的に、解放メソッド free() を使用してメモリを解放しました。

free(newPointer);

完全なソース コード:

#include <cstdlib>
#include <iostream>
using namespace std;

int main() {
  int *newPointer = (int *)malloc(0);

  if (newPointer == NULL) {
    cout << "Null value";
  } else {
    cout << "Address = " << newPointer;
  }

  free(newPointer);
  return 0;
}

出力:

Address = 0x56063cf64eb0
著者: Saad Aslam
Saad Aslam avatar Saad Aslam avatar

I'm a Flutter application developer with 1 year of professional experience in the field. I've created applications for both, android and iOS using AWS and Firebase, as the backend. I've written articles relating to the theoretical and problem-solving aspects of C, C++, and C#. I'm currently enrolled in an undergraduate program for Information Technology.

LinkedIn

関連記事 - C++ Array