もっと詳しく
2D配列は、通常のメモリを使用する方法とフリーストアを使用する方法の2つの方法で作成できます。 プログラムが実行されているとき、そのプログラムには通常のメモリ部分と使用する追加のメモリがあります。 プログラムは、フリーストアと呼ばれる余分なメモリを使用する義務はありません。 プログラムは、通常のメモリに通常の2D配列を作成します。 プログラムがフリーストアに同じ2D配列を作成する場合は、動的に作成する必要があります。 どちらの種類のメモリにも2次元配列を作成するための構文は異なります。 通常の2D配列を削除するには、スコープから外します。 フリーストアで作成された2Dアレイを削除するには、deleteを使用します[] 適切にオペレーター。

通常の2D配列の作成

次のステートメントは、通常の2D配列を作成します。

文字列arr2D[][5] = {{{{「AA」 「AB」 “交流” “広告” 「AE」}

{{「BA」 「BB」 “紀元前” 「BD」 “なれ”}

{{「CA」 「CB」 「CC」 “CD” 「CE」}

{{「DA」 「DB」 「DC」 「DD」 「DE」}

{{「EA」 「EB」 「EC」 「ED」 「EE」}};

この配列がグローバルスコープで作成されている場合、グローバルスコープで使用(要素値の再割り当てなど)することはできません。 ただし、他のスコープの値をその要素のいずれかに再割り当てすることができます。

この配列を削除するには、スコープから外します。 グローバルスコープ以外のスコープで作成された場合、ブロック(})の最後でスコープ外になります。 グローバルスコープで作成された場合、プログラムの最後でのみスコープ外になります。

フリーストア2Dアレイ

次のステートメントは、上記の配列が異なるポインター名でフリーストアに動的に作成される方法を示しています。

ストリング ((*ptr2D)。[5] = 新しい文字列[5][5] {{{{「AA」 「AB」 “交流” “広告” 「AE」}

{{「BA」 「BB」 “紀元前” 「BD」 “なれ”}

{{「CA」 「CB」 「CC」 “CD” 「CE」}

{{「DA」 「DB」 「DC」 「DD」 「DE」}

{{「EA」 「EB」 「EC」 「ED」 「EE」}};

new演算子を使用して2D配列がどのように作成されたかに注意してください。 配列の名前はptr2Dです。

この配列がグローバルスコープで作成されている場合、グローバルスコープで使用(要素値の再割り当てなど)することはできません。 ただし、他のスコープで値を再割り当てして、その要素のいずれかを持つことができます。

この配列を削除するには、deleteを使用します[] 以下に示すように、演算子。 フリーストア内のアレイは、スコープ外に出して実際に削除することはできません。 削除して削除する必要があります [] 演算子は、そのスコープ内で、メモリを解放するために使用されます。

記事の内容

–はじめに–上記を参照

–2D通常配列の削除

–フリーストアの動的に作成された2Dポインタ配列の削除

– 結論

2D通常配列の削除

2次元の通常の配列は、スコープから外すだけで削除されます。 次のプログラムは、ネストされたスコープでこれを示しています。

#include

名前空間stdを使用する;

int 主要(()。
{{
もしも ((1 == 1)。 {{
文字列arr2D[][5] = {{{{「AA」 「AB」 “交流” “広告” 「AE」}
{{「BA」 「BB」 “紀元前” 「BD」 “なれ”}
{{「CA」 「CB」 「CC」 “CD” 「CE」}
{{「DA」 「DB」 「DC」 「DD」 「DE」}
{{「EA」 「EB」 「EC」 「ED」 「EE」}};
カウト<< arr2D[1][1] <<endl;
}
// cout << arr2D[1][1] << endl;

戻る 0;
}

出力は、BBです。 if-constructには、ネストされたスコープであるブロックがあります。 配列はブロックの終わりに存在しなくなります。 プログラムのブロックのすぐ下にコメントインジケーターがあります。 削除すると、プログラムはコンパイルされず、エラーメッセージが発行されます。 これは、2D配列がブロックの終わりで死んでいるという事実に起因します。

次のプログラムでは、関数本体で宣言された通常の2D配列は、関数ブロックの最後で終了します。

#include

名前空間stdを使用する;

空所 fn(()。 {{
文字列arr2D[][5] = {{{{「AA」 「AB」 “交流” “広告” 「AE」}
{{「BA」 「BB」 “紀元前” 「BD」 “なれ”}
{{「CA」 「CB」 「CC」 “CD” 「CE」}
{{「DA」 「DB」 「DC」 「DD」 「DE」}
{{「EA」 「EB」 「EC」 「ED」 「EE」}};
カウト<< arr2D[1][1] <<endl;
}
// cout << arr2D[1][1] << endl;

int 主要(()。
{{
fn(()。;

戻る 0;
}

出力はまだBBです。 プログラムの機能ブロックのすぐ下にコメントインジケータがあります。 削除すると、プログラムはコンパイルされず、エラーメッセージが発行されます。 これは、2D配列がブロックの終わりで死んでいるという事実に起因します。 また、宣言後の2D要素への値の割り当ては、グローバルスコープでは許可されていないことを思い出してください。

フリーストアの動的に作成された2Dポインタ配列を削除する

宣言後の割り当ては、グローバルスコープでは許可されていません。 したがって、教育上の理由から、ネストされたスコープのC++メイン関数に2D配列宣言を含めると便利です。

上記の形式で宣言された2次元配列は、「delete」という構文で削除されます。[] 2Darray」。 この削除は、メモリを解放し、メモリリークを回避するために、そのスコープ内で実行する必要があります。 次のプログラムは、ネストされたスコープを使用してこれを示しています。

#include

名前空間stdを使用する;

int 主要(()。
{{
もしも ((1 == 1)。 {{
ストリング ((*ptr2D)。[5] = 新しい文字列[5][5] {{{{「AA」 「AB」 “交流” “広告” 「AE」}
{{「BA」 「BB」 “紀元前” 「BD」 “なれ”}
{{「CA」 「CB」 「CC」 “CD” 「CE」}
{{「DA」 「DB」 「DC」 「DD」 「DE」}
{{「EA」 「EB」 「EC」 「ED」 「EE」}};
カウト<< ptr2D[0][0] <<endl;

消去 [] ptr2D;

カウト<< ptr2D[0][0] <<endl;
}

戻る 0;
}

出力は、ptr2DからのAAです。[0][0]。 削除後、ptr2D[0][0] 何も返しません。 ptr2Dなどの他の要素が[1][1] それでも値を返す場合、配列は削除されたと見なされます。

ポインタツーポインタとしての2Dフリーストアアレイ

2D配列は、ポインターからポインターとして作成できます。 この場合、残っている1次元配列を削除する前に、最初にすべての行を削除する必要があります。 次のプログラムは、C++のメイン関数でこれを示しています。

#include

名前空間stdを使用する;

int 主要(()。
{{
ストリング ****ptr2D = 新しい文字列*[3]; //行数
ptr2D[0] = 新しい文字列[5];
ptr2D[0][0] = 「AA」; ptr2D[0][1] = 「AB」; ptr2D[0][2] = “交流”; ptr2D[0][3] = “広告”;
ptr2D[1] = 新しい文字列[5];
ptr2D[1][0] = 「BA」; ptr2D[1][1] = 「BB」; ptr2D[1][2] = “紀元前”; ptr2D[1][3] = 「BD」;
ptr2D[2] = 新しい文字列[5];
ptr2D[2][0] = 「CA」; ptr2D[2][1] = 「CB」; ptr2D[2][2] = 「CC」; ptr2D[2][3] = “CD”;

カウト<< ptr2D[1][1] <<endl;

//各サブ配列を解放します(行)
にとって((int= 0;<< 3; ++)。 {{
消去[] ptr2D[i];
}
消去[] ptr2D; //ポインタの配列を解放します

カウト<< ptr2D[1][1] <<endl;

戻る 0;
}

削除前の出力はBBです。 削除後、ptr2Dからの戻り値[1][1] なんでもない。

現在、フリーストア内のこのポインター2D配列は、ポインター配列の1次元配列のポインターです。 したがって、フリーストアで2D配列を削除するには、最初にすべての行をdeleteで削除する必要があります。[] 主要な1次元ポインタ配列が削除される前。 これは削除を使用します[] フリーストアの2D配列の演算子スキーム。

ライブラリの包含

newおよびdelete演算子は、実際にはライブラリで定義されています。 ただし、このライブラリを含めることはオプションです。

結論

2Dの通常の配列を削除するには、スコープから外します。 2Dアレイがフリーストアにある場合は、削除を使用して削除する必要があります[] 宣言されたスコープ内のメモリを解放する演算子。 フリーストアの2Dアレイが従来の構文で作成された場合、単純な「削除 [] 2DarrayName」は削除を行います。 ポインタからポインタとして作成された場合は、最初に「delete」を使用して行を削除する必要があります。 [] 2DarrayName[i]」、次に残りの1D配列(要素なし)を「delete」で削除します。 [] 2DarrayName」。

The post C++で2次元配列を削除する方法 appeared first on Gamingsym Japan.