3

果てしない幸せの追求の中で、こんなものに出会いました

auto temp = new int;
delete[0] temp;

心の中では… 「これは正しくない!」と思っていました。そこで、最も特別で反抗的なスノーフレーク コンパイラを起動してテストしたところ、何の問題もなくコンパイルされ、実行されました。

次に、GCC(4.8.1)で試してみましたが、このエラーで拒否されました

エラー: 数値定数の前に ']' が必要です

では、同志の皆さん、どちらが正しいですか?(確かにMSVC(11)ではありませんか?!)そして、標準を引用できればそれは素晴らしいことです。

4

4 に答える 4

12

C++ の黎明期にさかのぼると、配列を削除すると、割り当てた配列のサイズを指定する必要がありました。

int * x = new int[10];
// ...
delete [10] x;

これは多くの問題を引き起こしたため、この要件はずっと前に廃止されました。最初の C++ 標準が作成されるまでに、この構文は公式には許可されなくなりました。

それにもかかわらず、多くのコンパイラは、この構文を使用する古いコードとの互換性のために、依然としてこの構文を受け入れています。MS VC++ では、これはデフォルトで受け入れられますが、標準への準拠 (-Za) を要求すると、次のようなエラーが表示されます。

error C2203: delete operator cannot specify bounds for an array

new義務的なことはさておき:とにかく配列を割り当てるために使用すべきではありません。を使用しstd::vectorます。

于 2013-09-20T07:38:03.693 に答える
0

運が良かったので問題なく動きました。通常、new による割り当てと delete[] による削除は未定義の動作であり、「問題なく実行」は UB で許可されている一連の動作に属します。このようなコードは、テストでは問題なく動作することがありますが、最も重要な顧客向けのライブ デモなど、最も予想外の瞬間に中断します。

于 2013-09-20T07:56:04.413 に答える