1. 程式人生 > >C++ 二維陣列/多維陣列的動態分配(new)和釋放(delete)

C++ 二維陣列/多維陣列的動態分配(new)和釋放(delete)

1. 一維陣列

對於簡單的一維陣列動態記憶體分配和釋放,如下:

int *array1D;//假定陣列長度為m

//動態分配空間
array1D = new int [m];

//釋放
delete [] array1D;

2. 二維陣列

二維陣列的動態分配和釋放

//假定陣列第一維長度為m, 第二維長度為n

//動態分配空間
<pre name="code" class="cpp">int **array2D<span style="font-family: Arial, Helvetica, sans-serif;"> = new int *[m];</span>
for( int i=0; i<m; i++ ){ array2D[i] = new int [n] ;}//釋放for( int i=0; i<m; i++ ){ delete [] arrar2D[i];}delete array2D;//我覺得應該是 delete [] array2D; P.S. 事實上二維陣列空間的釋放還可以更簡單地用:delete [] array2D;

二維陣列的另一種分配和釋放形式:

//假設第一維長為m,第二維長為n

//動態分配空間
<pre name="code" class="cpp">int** array2D=new int*[m];
array2D[0]=new int[m*n];
for(int i=1;i<m;++i)
  array2D[i]=array2D[i-1]+n;
//釋放delete [] array2D[0];delete [] array2D;


3. 三維陣列

三維陣列的動態分配和釋放

int ***array3D;//假定陣列第一維為m, 第二維為n, 第三維為h

//動態分配空間
array3D = new int **[m];
for( int i=0; i<m; i++ )
{
    array3D[i] = new int *[n];
    for( int j=0; j<n; j++ )
    {
         array3D[i][j] = new int [h];
    }
}

//釋放
for( int i=0; i<m; i++ )
{
    for( int j=0; j<n; j++ )
    {
         delete array3D[i][j];//覺得應該是 delete [] array3D[i][j];
    }
    delete array3D[i];//覺得應該是 delete [] array3D[i];
}
delete array3D;//覺得應該是 delete [] array3D;

4. 二維陣列的一個例子

其中的解構函式用到了delete,建構函式用到了new進行分配。
// W4-課程作業-填空題1-3.cpp : Defines the entry point for the console application.
/*
寫一個二維陣列類 Array2,使得下面程式的輸出結果是:
輸入
無
輸出
0, 1, 2, 3,
4, 5, 6, 7,
8, 9, 10, 11,
next
0, 1, 2, 3,
4, 5, 6, 7,
8, 9, 10, 11,
*/

#include "stdafx.h"
#include <iostream>
#include <cstring>
using namespace std;
// 在此處補充你的程式碼
class Array2
{
private:
	int hang, lie;
	int **iar;
public:
	Array2() :hang(0), lie(0), iar(NULL) {}
	Array2(int h, int l) :hang(h), lie(l)
	{
		iar = new int*[h];
		iar[0] = new int[h*l];
		for (int i = 1; i < h; ++i)
			iar[i] = iar[i - 1] + l;
	}
	~Array2()
	{
		//cout << "";
		if (iar != NULL)
		{
			delete[] iar[0];  //delete的方式要對,不然就會出現_Block_Type_Is_Valid (pHead->nBlockUse) Error
			delete[] iar;
		}
	}
	int*& operator[](int m)
	{
		return iar[m];
	}
	const int operator() (int m, int n)
	{
		return iar[m][n];
	}
	Array2& operator=(const Array2& ar)
	{
		if (ar.iar == iar) return *this;
		if (iar != NULL)
		{
			for (int i = 0; i < hang; ++i)
				delete[] iar[i];
			delete[] iar;
		}
		if (ar.iar != NULL)
		{
			hang = ar.hang;
			lie = ar.lie;
			iar = new int*[hang];
			iar[0] = new int[hang*lie];
			for (int i = 1; i < hang; ++i)
				iar[i] = iar[i - 1] + lie;
			for (int i = 0; i < hang; ++i)
				for (int j = 0; j < lie; ++j)
					iar[i][j] = ar.iar[i][j];
		}
		else
		{
			hang = 0;
			lie = 0;
			iar = NULL;
		}
		return *this;
	}
};

int _tmain(int argc, _TCHAR* argv[])
{
	Array2 a(3, 4);
	int i, j;
	for (i = 0; i < 3; ++i)
		for (j = 0; j < 4; j++)
			a[i][j] = i * 4 + j;
	for (i = 0; i < 3; ++i) {
		for (j = 0; j < 4; j++) {
			cout << a(i, j) << ",";
		}
		cout << endl;
	}
	cout << "next" << endl;
	Array2 b;     
	b = a;
	for (i = 0; i < 3; ++i) {
		for (j = 0; j < 4; j++) {
			cout << b[i][j] << ",";
		}
		cout << endl;
	}

	return 0;
}
參考:http://www.cnblogs.com/Sylla-Zhang/archive/2012/10/08/2715300.html