web-dev-qa-db-ja.com

ポインタへのポインタを削除します(配列の配列として)

私のコードにこれがあります:

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;

31
yelo3

従うべき単純なルール:

  • 割り当てごとに、割り当て解除が必要です(ex1は間違っているため)
  • newを使用して割り当てられたものは、deleteを使用して解放し、new[]delete[]を使用して解放し、mallocfreeを使用して解放する必要があります(ex3は間違っているため)

結論、ex2はOKです。

21
Let_Me_Be

コードはコンパイルできません。配列の新しい式のタイプは、作成される配列要素のタイプへのポインターです(値は、割り当てられた配列の最初の要素へのポインターです)。

したがって、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;
21
CB Bailey

削除すると割り当てが反映されます。

new []を使用して外部配列を割り当て、new [](ループ内)を使用して内部配列を割り当てたので、削除についても同様に行います。つまり、2番目のソリューションは正しいです。 delete []ループ内の内部配列、最後にdelete []を介した外部配列。

つまり、C(++)で(muchmuch)より良い解決策は、ネストされたstd::vectorを使用することです。

// Declaration and initialization:
vector<vector<double> > desc(size_out, vector<double>(size_in));

// No deletion!
18
Konrad Rudolph

ソリューション2は正しいものです。各セルは、delete[]を使用して削除する必要がある動的に割り当てられた配列を指します。最後に、desc配列自体はdelete[]を使用して削除する必要があります。

ボーナスソリューション4:配列の使用を避け、std::vector<std::vector<double> >に切り替えます。

6
icecrime

私はするだろう

for (int i=0; i<size_out; i++)
    delete [] desc[i];
delete [] desc;

new []で割り当てられた配列ごとに、対応するdelete []があります。

そしてRupdolphが言うように:C配列の使用をやめて、std::vectorの使用を開始してください。バグが減ります(数百倍のバグが減ります)。

5