某些数组在我们定义时并不能明确知道其范围,他们虽调用的变化而变化,当然我们也可以预定一个比较大的MAXNLEN但这种静态声明有时会浪费比较多的内存空间。我们可以用C++的动态内存分配机制来动态地确定一个数组的空间大小,使用动态内存分配时,一定不要忘了delete!!!
例如要给一个整数动态分配内存空间,必须用下面的语句声明一个整形指针变量。
int *y;
// 把声明,动态存储分配,赋值合并为下
int *y = new int;
*y = 284;
//或者
int *y = new int(220);
一维数组:
int *arr = new int[len];
操作符new为len个整形数分配了存储空间,并返回第一个整形数空间的指针。
delete操作符(Important):
动态分配的存储空间不需要时应该要将其释放,否则可能会导致内存泄漏,程序崩溃等许多严重问题。
//释放变量内存
delete y;
//释放一维数组内存
delete[] x;
二维数组:
如果数组的列数在编译时也是未知的,那么不可能仅调用一次new就创建这个二维数组(即使数组的行数在编译时是已知的)。要构造这样的二维数组,可以把它看做是由若干行所构成的结构,每一行都是一个能用new来创建的一维数组。指向每一行的指针保存在另一个一维数组之中。
template<class T>
bool make2dArray(T ** &arr, int numberOfRows, int numberOfColumns) {
//创建一个二维数组
try{
//创建行指针
arr = new T * [numberOfRows];
//为每一行分配空间
for(int i = 0; i < numberOfRows; ++i) {
arr[i] = new int [numberOfColumns];
}
return true;
}catch (bad_alloc) {
cerr << "Out of memory" << endl;
return false;
}
}
读者可以借此思考一下,编写一个更具一般性的算法,比如不浪费存储空间的情况下开一个二维数组,该数组的每一行所含元素的个数可能不同。
可以参考我的另一篇博客!