14

私の質問は私のコードコメントにあります:

int* a = new int[0];// I've expected the nullptr according to my logic...
bool is_nullptr = !a; // I got 'false'
delete[] a; // Will I get the memory leaks, if I comment this row?

ありがとうございました。

4

5 に答える 5

10

C++03 では、 の間の値は厳密に正の値でなければならないnew int[0]ため、未定義の動作が発生します。ゼロは不適切です (5.3.4/6 "New")。[]そのため、後でメモリ リークがあるかどうかを尋ねることは、ある意味で無意味です。

C++11 ではnew int[0]、長さ 0 の配列を割り当てるためにアロケータが呼び出されます (5.3.4/7 "New")。割り当て要求が成功すると、ポインターが返されます。標準には、そのポインターが指すブロックに含まれるメモリの量を示すものは何もありませんが、少なくとも要求されたサイズである必要があります。ただし、少なくとも 1 文字を割り当てる効果はあります。これは、そのアドレスが解放されるまで、アロケーターによってそのアドレスを再度返すことができないためです。実際には、簿記のオーバーヘッドは複数の文字になります。

于 2013-07-02T07:31:46.083 に答える
7

はい、リークがあり、実装に依存しません。

この新しい式はヌル ポインターを生成できません。を呼び出してメモリを割り当てますoperator new[]。これは、「適切に整列されたストレージに null 以外のポインターを返すか、bad_alloc例外をスローする」ために必要です (C++11 §18.6.1.1/3 および §18.6.1.2/3 を参照)。

さらに、割り当て関数の要件 (§3.7.4.1) では、割り当て関数を呼び出すたびに、割り当てられているがまだ割り当て解除されていない他のすべてのポインターとは異なるポインターを返す必要があります。したがって、実装は、常に返す単一の「空の割り当て」ポインターを持つことはできません。

このように、すべての配列形式の new 式は、エクステントがゼロであっても何かを割り当てます。を介してそのオブジェクトの割り当てを解除しない場合はdelete[]、リークしています。

于 2013-07-02T07:31:02.677 に答える
4

はい、そうしないdeleteとメモリリークが発生します。

Everynewは とペアにする必要がありdeleteます。プログラマーが割り当てたサイズが 0 の場合でも、アラインメント要件、管理オーバーヘッド、またはその他の理由により、アロケーターは要求されたよりも多くのメモリを割り当てる場合があります。

于 2013-07-02T07:17:45.803 に答える
4

この場合、 a が返されるかどうかは実装で定義されnullptrますが、このポインターを逆参照しないように注意する必要があります。また、呼び出しdeleteを行わないとメモリ リークが発生します。

ルールを呼び出すことdeleteについての記述は単純です。「
呼び出す場合は、 を呼び出すnew必要がありますdelete。」

訂正:
他の回答の引用が明らかにしたように、それはあなたにnullptr.

于 2013-07-02T07:18:24.973 に答える