私のコードにこれがあります:
double** desc = new double* [size_out];
for (int i = 0; i < size_out; i++)
desc[i] = new double [size_in];
このdesc
を削除するにはどうすればよいですか?
私がすべきか:
delete [] desc;
または
for (int i=0; i<size_out; i++)
delete [] desc[i];
delete [] desc;
または
for (int i=0; i<size_out; i++)
delete [] desc[i];
delete desc;
?
従うべき単純なルール:
new
を使用して割り当てられたものは、delete
を使用して解放し、new[]
はdelete[]
を使用して解放し、malloc
はfree
を使用して解放する必要があります(ex3は間違っているため)結論、ex2はOKです。
コードはコンパイルできません。配列の新しい式のタイプは、作成される配列要素のタイプへのポインターです(値は、割り当てられた配列の最初の要素へのポインターです)。
したがって、new double**[size_out]
のタイプはdouble ***
です。
Newの配列形式を使用する場合は常に、サイズが1の配列のみを割り当てる場合でも、deleteの配列形式を使用する必要があります。
double*** desc = new double**[size_out];
for (int i=0; i<size_out; i++)
desc[i] = new double*[size_in];
for (int i=0; i<size_out; i++)
delete[] desc[i];
delete[] desc;
double
はまだ割り当てられていないことに注意してください。ポインタのみです。
代わりにこれが本当に必要でしたか?
double** desc = new double*[size_out];
for (int i=0; i<size_out; i++)
desc[i] = new double[size_in];
for (int i=0; i<size_out; i++)
delete[] desc[i];
delete[] desc;
削除すると割り当てが反映されます。
new []
を使用して外部配列を割り当て、new []
(ループ内)を使用して内部配列を割り当てたので、削除についても同様に行います。つまり、2番目のソリューションは正しいです。 delete []
ループ内の内部配列、最後にdelete []
を介した外部配列。
つまり、C(++)で(much、much)より良い解決策は、ネストされたstd::vector
を使用することです。
// Declaration and initialization:
vector<vector<double> > desc(size_out, vector<double>(size_in));
// No deletion!
ソリューション2は正しいものです。各セルは、delete[]
を使用して削除する必要がある動的に割り当てられた配列を指します。最後に、desc
配列自体はdelete[]
を使用して削除する必要があります。
ボーナスソリューション4:配列の使用を避け、std::vector<std::vector<double> >
に切り替えます。
私はするだろう
for (int i=0; i<size_out; i++)
delete [] desc[i];
delete [] desc;
new []
で割り当てられた配列ごとに、対応するdelete []
があります。
そしてRupdolphが言うように:C配列の使用をやめて、std::vector
の使用を開始してください。バグが減ります(数百倍のバグが減ります)。