我的问题是为什么析构函数不释放我的临时数组的内存?Valgrind告诉我,我在构造函数中使用了new运算符,但之后没有删除内存.当我简单地写作时delete temp
,我在Valgrind中遇到了许多错误,例如无效读取大小,双重免费等等.你能告诉我们这里发生了什么吗?
array_xyz(const int r, const int c, double **arg_array) { rows = r; cols = c; array_xyz *temp = new array_xyz(); temp->arr = new double *[rows]; temp->rows = r; temp->cols = c; arr = new double *[rows]; for (int i = 0; i < rows; i++) { arr[i] = new double [cols]; temp->arr[i] = new double [cols]; } for (int j = 0; j < rows; j++) { for (int k = 0; k < cols; k++) temp->arr[j][k] = arg_array[j][k]; } arr = temp->arr; //delete temp; -> doesn't work, valgrind tells that I free memory twice } array_xyz() { rows = 0; cols = 0; arr = NULL; } ~array_xyz() { for (int i = 0; i < rows; i++) delete []arr[i]; delete []arr; }
user31264.. 5
您分配arr
(及其所有行)和temp_arr
(及其所有行).然后你做arr=temp_arr;
.它不会复制temp_arr
to的值arr
.相反,它强制arr
指向相同的地址temp_arr
.分配给arr
以前的整个内存现在是孤立的(没有指向它的指针,所以你不能释放它,它没有用处).如果删除temp_arr
,它会自动删除arr
,因为它们现在指向内存中的相同位置.
您分配arr
(及其所有行)和temp_arr
(及其所有行).然后你做arr=temp_arr;
.它不会复制temp_arr
to的值arr
.相反,它强制arr
指向相同的地址temp_arr
.分配给arr
以前的整个内存现在是孤立的(没有指向它的指针,所以你不能释放它,它没有用处).如果删除temp_arr
,它会自动删除arr
,因为它们现在指向内存中的相同位置.