2 D配列の長さを変更する関数changeLength 2 Dを作成します.2 D配列の各次元の長さは変化します


これは第5章の練習問題で、編纂の過程でいくつかの時間を費やして、ここで自分の整理した知識を整理します.考え方:まず、2次元配列の行と列の長さを変更するには、行と列のアドレスを取得し、新しい行と列の長さと元の行列の長さをテンプレート関数で処理し、元の配列のアドレスを持つ必要があります.そのため、カスタムテンプレート関数には5つのエントリパラメータが必要です.次に,配列の大きさがわからないため,付与時に開くメモリが足りない,あるいは新しい配列の長さが大きすぎるなどの問題が発生する可能性があるが,ここでは,本の構想を用いてalgorithmのmin関数を用いて付与操作を行うことができる.第三に、ポインタを用いて二次元配列を指し、テンプレート関数の中で動的に新しい配列を開き、各次元配列のヘッダアドレスを取得するには、必ずforループを用いてアドレス割り当てを行い、新しい配列を開き、割り当て印刷(印刷は自分の関数が正しいかどうかを証明するために、テストを便利にする)を行った後、元の配列のメモリを解放しなければならない.
1 D配列の開発と解放を実現するには、次のようにします.
int n;
cin>>n>>endl;
int* arr=new int[n];

リリースする場合は、次のようにします.
delete[] arr;

ここで注意しなければならないのは[]を少なくしてはいけません.そうしないと、deleteは配列が占めるメモリ領域を完全に解放することはできません.2 D配列では、次のことができます.
int num1,num2;
cin>>num1>>num2>>endl;
int **arr=new int*[num1];
for(int i=0;i

1 Dのように簡単に解放することはできません.
delete[] arr;

次のようにします.
for(int i=0;i

次にテストを行い、C++コンパイルエラー、書き込みメモリエラーを発見し、最後にこの場所に問題が発生したことを発見した:静的に割り当てられたメモリはスタックの中にあり、1つの関数に入るたびにスタックが建てられ、スタックの中には関数で使用したパラメータ、局所変数などの情報が格納され、関数数が実行された後、スタックがスタックを破壊し、このプロセスは、システムによって自動的に完了する静的に割り当てられた配列メモリを解放します.動的に割り当てられたメモリは、実際にスタック上にあり、システムが自動的にスタック上のメモリを解放することはできません.freeやdeleteを自分で書いて、オペレーティングシステムがスタック上のどの位置のメモリを解放する必要があるかを伝える必要があります.したがって,テスト時の実際の配列は静的配列ではなく動的配列であるべきである.直したら間違いがないことに気づいた.テストコードは次のとおりです.
#include 
#include  
using namespace std;

template
void changeLength2D(T** a, int oldNum1,int oldNum2, int newNum1,int newNum2)
{
   /*if (newNum1 < 0 || newNum2<0)
      throw illegalParameterValue("new length must be >= 0");*/

   T** temp = new T*[newNum1];              // new array
   for(int i=0;i