8

以下のようにサイズ1のオブジェクトを割り当てると

int *arr = new int[1];

またはを使用してオブジェクトを削除する必要がありますoperator delete[]operator delete?

私が懸念している理由は、コンパイラがステートメントをUB のint *arr = new int呼び出しを引き起こす単一の要素割り当てとして変換するのに十分スマートであるかどうかです。operator delete[]

ユーザーケース:

私はポインターを持っています。これはさまざまな方法で割り当てられますが、最終的には削除したいと思います。int *arr = new int[1]単一要素の割り当てについて、一貫して使用する場合、一貫して安全に使用できるかどうか疑問に思っていましたoperator delete[]

ノート

あなたの答えを裏付けるために、基準を参照していただけますか?

4

6 に答える 6

13

delete[]ではなく、 を使用する必要がありますdelete。コンパイラは に変更できませnew int[1]new int

( intPOD タイプの場合と同様に、カバーの下で と がまったく同じことnew intを行う可能性は十分にありnew int[1]ますが、その場合は、何度も何度も がまったく同じことを行います。)delete[]int*deleteint*

ISO/IEC 14882:2011 5.3.5 [expr.delete] / 2:

最初の選択肢 ( delete object ) では、オペランドの値はnull ポインター値、前のnew-expressiondeleteによって作成された非配列オブジェクトへのポインター、またはベースを表すサブオブジェクト (1.8) へのポインターである可能性があります。そのようなオブジェクトのクラス (箇条 10)。そうでない場合、動作は未定義です。

配列オブジェクトと同様に、 and notでint[1]削除しようとすると、動作が未定義になります。deletedelete[]

于 2013-07-12T07:25:57.970 に答える
2

演算子delete[]またはを使用してオブジェクトを削除する必要がありますかoperator delete?

operator delete[]. s の配列を割り当てたintので、正しく割り当てを解除する方法は他にありません。を使用operator deleteすると、未定義の動作が発生します。

于 2013-07-12T07:26:28.320 に答える
1
int *arr = new int[1];

for allocationを使用するため、 forも[]使用する必要があります。[]delete

メモリリーク

新しい式によって作成されたオブジェクト (動的記憶域期間を持つオブジェクト) は、新しい式によって返されたポインターが一致する削除式で使用されるまで存続します。

したがってdelete[]、メモリを解放するために使用する必要があります。そうしないと、未定義の動作が発生します。

そして場合によっては)、コンパイラが as を取るのに十分賢いなら、それは as を取るのに十分賢いに違いint * arr = new int[1]ない。ただし、 fromとを区別するものは何もありません。inはそれを示します。intdelete[] arrarrdelete arrdeletearrint*arr = new int[1]int*arr = new int[]delete

于 2013-07-12T07:44:39.207 に答える
0

いいえ、安全ではありません。望ましくない状況につながる可能性があります。
たとえば、int/char/floatポインタが指している場所の隣にあるデータ ( ...) がメモリ内に存在する可能性があります。その時点で使用した場合delete [] 、そのデータが整数の場合はそのデータも削除しようとする可能性があり、他のデータ型の場合は予期しないエラーが発生します。

例:

int *ptr = new int;
int a = 20;
char c = 'e';
*ptr = 10;
delete [] ptr;

ポインタが指す場所の隣にcおよび変数が格納される可能性があります。 がその隣に格納されている場合は、" " も削除されます。また、他のデータ型が存在する場合は、実行時に予期しない結果が生じる可能性があります。aptraa

delete[]したがって、新しいデータ型を使用して割り当てられたメモリの削除にのみ使用することをお勧めします[]。これが役立つことを願っています。

于 2013-07-12T10:07:26.417 に答える