C++プログラミングノート:2 D配列の動的割り当てと解放


与えられた条件が異なる場合,2次元配列の動的割り当て方式は異なる.たとえば、2 D配列の行数(すなわち、1 D次元)がどれだけあるかが知られている場合に動的に割り当てられ、列数(2 D次元)が知られている場合や、2 D配列の動的な割り当て方法が不明な場合とは異なり、対応する解放方法も異なります.以下、一つ一つ紹介します.
1.既知の2 D配列の行数
const int ROW=3;//    
int *a[ROW];//    

int col; //     ,    
cin>>col;

//    
for(int i=0;inew int[col];
    /*      
    for (int j = 0; j < col; j++){
        cin >> a[i][j];
    }*/
}

/*    
for (int i = 0; i < M; i++){
    for (int j = 0; j < col; j++){
        cout << a[i][j] << " ";
    }
    cout << endl;
}
*/  
//  
for(int i=0;idelete[] a[i];
}

上記の方法でポインタが指す配列はメモリに連続的に格納されるとは限らず,メモリの連続性を保つ必要がある場合はメモリを一度に割り当てる必要がある.
1.1既知の2 D配列の行数、一度にメモリを割り当てる(メモリの連続性を保つ)
const int ROW=3;//    
int *a[ROW];//    

int col; //     ,    
cin<//    
a[0]=new int[ROW*col];
for(int i=1;i1]+col;
}

//  
delete[] a[0];

2.既知の2 D配列の列数
const int COL=2;//    
int (*a)[COL];//    

int row;//     ,    
cin<//    
a=new int[row][COL];

//  
delete[] a;

3.不明な2 D配列の行数と列数
int **a;//     

int row,col;//       ,    
cin<//    
a=new int*[row];
for(int i=0;inew int[col];
}

//  
for(int i=0;idelete[] a[i];
}
delete[] a;

同様に、上記の方法でポインタが指す配列はメモリにおいても必ずしも連続的に格納されるものではなく、メモリの連続性を保つ必要がある場合は、一度にメモリを割り当てる必要がある.
3.1未知の2 D配列の行数と列数、1回のメモリ割り当て(メモリの連続性を維持)
int **a;//     

int row,col;//       ,    
cin<//    
a=new int*[row];
a[0]=new int[row*col]
for(int i=1;i1]+col;
}

//  
delete[] a[0];
delete[] a;

特に、newとdeleteをペアで使用するには、複数のnewが複数のdeleteを有し、newとdeleteの形式が一致しているため、メモリの漏洩を回避できます.