实现指向指针的指针的深复制
如编写一个构造函数初始化一个矩阵。矩阵元素用一个二维数组来表示。
//定义了一个表示矩阵的类
class Matrix {
public:
Matrix(string name, int height, int width, int** element);
~Matrix();
private:
string name;
int height;
int width;
int** param;
};
//构造函数的实现
Matrix::Matrix (string name, int height, int width, int** element) {
this->name = name;
this->height = height;
this->width = width;
//实现指向指针的指针的深复制
param = new int*[height];//申请一块内存用来储存元素为指向int的指针的数组,这些指针分别指向每一行
for (int i = 0; i < height; ++i) {
//为每一个存放指针的数组申请一块内存储存元素为int的数组,这个数组储存一行里的每一个元素,并将元素初始化为0
param[i] = new int[width]();
for (int j = 0; j < width; ++j) {
param[i][j] = element[i][j];//进行逐个元素赋值
}
}
}
因为在这里指向指针的指针,实际上指向一个二维数组,所以要单独为每一个维度申请一块内存,第二个维度要用循环逐个申请内存。
注意在申请最底层的维度时,在new语句最后加上括号(),将元素初始化,不然容易出现垃圾值,后续操作会出现问题。
删除操作
Matrix::~Matrix() {
for (int i = 0; i < height; ++i) {
delete []param[i];//先将存放int型元素的数组内存逐个释放掉
}
delete []param;//最后将指向这些数组的指针的空间释放
}
记:释放空间的顺序和申请空间的顺序相反