c++ダイナミック配列の利点、作成と削除
1353 ワード
動的配列には、次の2つの方法があります.
1:配列の大きさを予め知ることができない動的配列
従来の配列(静的配列)は、プログラムが実行される前にint i=10などのサイズを指定する必要がある.int a[i]; これは合法的ではない.関数スタックの要件は,関数実行前にすべての変数を割り当てる空間であり,iは不定であるため,実行前に空間を割り当てることはできない.しかし,多くの場合,配列の大きさを予め知ることはできない.動的配列int*a=new int[i];この文は実行時に空間を割り当てることができ、合法的です.2:大配列格納時のスタック領域にはサイズ制限があります
従来の配列はスタック領域に格納されており、スタック領域にはサイズ制限があり、2 Mより大きい配列を申請するとプログラムがエラーを報告しますが...ダイナミック配列はスタック空間にあり、理論的にはメモリがどれだけ大きいかで、どれだけの配列を申請することができます.vcではスタックのデフォルトは1 Mです.a[10000000]よりも長い配列を作成するとスタックが不十分になる場合があります.一方、配列があまり大きくなくても、例えばa[10000000]のように、連続した配列を申請すると、リソースの浪費を招き、多くの要因でメモリの割り当てができず、メモリが得られない可能性があります.したがって、ダイナミック配列はメモリ領域を最大限に節約できます.
1 Dダイナミック配列の作成と削除
2 Dダイナミック配列の作成と削除2 Dマトリクスの作成を例に
newが出てくる配列は論理アドレス(仮想アドレス)が連続しているので、遍歴で読み取ることができますが、物理アドレスは必ずしもそうではありません(大きな配列で格納するので、これはオペレーティングシステムのことなので、ユーザーは気にしないでください).
1:配列の大きさを予め知ることができない動的配列
従来の配列(静的配列)は、プログラムが実行される前にint i=10などのサイズを指定する必要がある.int a[i]; これは合法的ではない.関数スタックの要件は,関数実行前にすべての変数を割り当てる空間であり,iは不定であるため,実行前に空間を割り当てることはできない.しかし,多くの場合,配列の大きさを予め知ることはできない.動的配列int*a=new int[i];この文は実行時に空間を割り当てることができ、合法的です.2:大配列格納時のスタック領域にはサイズ制限があります
従来の配列はスタック領域に格納されており、スタック領域にはサイズ制限があり、2 Mより大きい配列を申請するとプログラムがエラーを報告しますが...ダイナミック配列はスタック空間にあり、理論的にはメモリがどれだけ大きいかで、どれだけの配列を申請することができます.vcではスタックのデフォルトは1 Mです.a[10000000]よりも長い配列を作成するとスタックが不十分になる場合があります.一方、配列があまり大きくなくても、例えばa[10000000]のように、連続した配列を申請すると、リソースの浪費を招き、多くの要因でメモリの割り当てができず、メモリが得られない可能性があります.したがって、ダイナミック配列はメモリ領域を最大限に節約できます.
1 Dダイナミック配列の作成と削除
int *p = 0;
p = new int[10];//
delete [] p;
2 Dダイナミック配列の作成と削除2 Dマトリクスの作成を例に
double **data =0;//
data = new double *[rsize]; //
for (int i = 0; i < rsize; i++)
{
data[i] = new double[csize]; //data[i] ,
}
for (int i = 0; i < rsize; i++)
for (int j = 0; j < csize; j++)
data[i][j] = 0; //
/***** ****/
for (int i = 0; i < y; ++i)
{
delete p[i];// 。
p[i] = NULL;// p[i] NULL ,
}
delete []p;
p = NULL;
newが出てくる配列は論理アドレス(仮想アドレス)が連続しているので、遍歴で読み取ることができますが、物理アドレスは必ずしもそうではありません(大きな配列で格納するので、これはオペレーティングシステムのことなので、ユーザーは気にしないでください).