0

次のものはすべてを適切に破壊しますか(すべての適切なデストラクタが呼び出され、すべてのメモリが解放されます)?

Class* var[50];
var[0] = new SubClass();

delete[] *var;

に似ている

Class** var = new Class*[50];
var[0] = new SubClass();

delete[] var;

または、配列を反復処理して、個々のオブジェクトを削除する必要があります(これは、delete []が行ったと思っていたものです)。

4

4 に答える 4

3

適切な方法は、のようなリソース管理クラスを使用することですstd::vector<std::unique_ptr<MyClass>>。これにより、ユーザーの介入なしに常に正しいリソースのクリーンアップが保証されます。を認識または使用するC++コードはdelete、それらを回避するためにすぐにリファクタリングする必要があります。また、もう一度確認する必要があります。new[]delete[]new

于 2012-04-18T21:30:44.850 に答える
0

delete[]動的に割り当てられたアレイ用です。に対応しnew []ます。

C ++オープンスタンダード(3.7.4.2)からの抜粋

割り当て解除関数が例外をスローして終了した場合、動作は未定義です。割り当て解除関数に提供される最初の引数の値は、ヌルポインター値である可能性があります。その場合、および割り当て解除関数が標準ライブラリで提供されている関数である場合、呼び出しは効果がありません。それ以外の場合、標準ライブラリの演算子delete(void *)に提供される値は、演算子new(std :: size_t) または演算子new(std :: size_t、const std ::標準ライブラリのnothrow_t&)、および標準ライブラリの演算子delete [](void *)に提供される値は、いずれかの演算子new [](std :: size_t)の前回の呼び出しによって返される値の1つでなければなりません。または、標準ライブラリの演算子new [](std :: size_t、const std :: nothrow_t&)。

あなたの最初の例は使用しないnew []ので、使用することになっていないdelete []!!!

于 2012-04-18T21:28:13.293 に答える
0
Class* var[50];
var[0] = new SubClass();

delete[] *var;

これは未定義の動作です。適切な方法は

delete var[0]; //equivalent to delete *var;

配列の50個の要素すべてにメモリを割り当てる場合は、それぞれを繰り返して削除する必要があります。このように考えてください:

  • ごとnewに、関連付けられている必要がありますdelete
  • ごとnew[]に、あなたは仲間を持っている必要がありますdelete[]
  • 未定義の動作につながるため、と混同newしないでくださいdelete[]new[]delete

2番目のスニペットは不正なC++です。

編集あなたは明らかに初心者なので、これを少し分解してみましょう。2番目のスニペットはコンパイルすらできないので、最初のスニペットに焦点を当てます。

Class* var[50];

これは、への50個のポインタの配列を宣言しClassます。ポインタはぶら下がっています-それらは初期化Classされておらず、オブジェクトは作成されていません。

var[0] = new SubClass();

これにより、オブジェクトにメモリが割り当てられSubClass、配列の最初のポインタが割り当てられます。他のすべてのポインタは初期化されないままです。

*var;

最初の要素であるを返しますClass*。と同等var[0]です。

delete[] *var;

で割り当てられdelete[]たを呼び出そうとするため、未定義の動作が発生します。Class*new

于 2012-04-18T21:21:46.693 に答える
-2
for(int i = 0; i < 50;i++)delete var[i];
delete[] var;
于 2012-04-18T21:21:33.923 に答える