32

私は私のコードにこれを持っています:

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;

4

5 に答える 5

30

従うべき簡単なルール:

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

結論として、ex2はOKです。

于 2010-11-16T12:15:08.647 に答える
21

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

したがって、のタイプは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;
于 2010-11-16T12:43:25.607 に答える
19

削除は、割り当てを反映する必要があります。

以前new []は外部配列を割り当て、new [](ループ内で)内部配列を割り当てるために使用したので、削除についても同様に行います。つまり、2番目の解決策は正しいです。delete []ループ内の内部配列、そして最後に外部配列delete []も経由します。

そうは言っても、C ++での(はるか)より良い解決策は、ネストされたものを使用することです:std::vector

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

// No deletion!
于 2010-11-16T12:14:13.460 に答える
6

私はします

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

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

そして、Rupdolphが言うように、C配列の使用をやめ、。を使い始めstd::vectorます。バグが少なくなります(バグが100分の1になります)。

于 2010-11-16T12:14:52.180 に答える
6

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

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

于 2010-11-16T12:15:32.227 に答える