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