私の質問は、デストラクターが私の一時配列のメモリを解放しないのはなぜですか? 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;
}
メモリを解放するようにC++ランタイムに依頼しただけであるため、すぐにOSに解放されるわけではありません(ページ内の他の割り当ても解放する必要があります)。 –
1)コンストラクタが終了すると 'temp'は解放されません。 2) 'arr = temp-> arr;'は 'arr = new double * [rows];によって確保されたメモリへのポインタを上書きしないで最初に解放します。 3)「temp」が必要なのはなぜですか? –
'arr'は、構築しているオブジェクトのデストラクタで最終的に削除されるので、(同じアドレスを持つ)' temp'を削除するとデストラクタの 'free'とその間のすべてのアクセスが無効になります。 –