私がした後、言う
Foo* array = new Foo[N];
私はいつもこの方法で削除しています
delete[] array;
しかし、時々私はそれをこのように見ました:
delete[N] array;
コンパイルして動作するように見えるので (少なくとも msvc2005 では)、私は疑問に思います: それを行う正しい方法は何ですか? では、なぜ逆にコンパイルされるのでしょうか?
私がした後、言う
Foo* array = new Foo[N];
私はいつもこの方法で削除しています
delete[] array;
しかし、時々私はそれをこのように見ました:
delete[N] array;
コンパイルして動作するように見えるので (少なくとも msvc2005 では)、私は疑問に思います: それを行う正しい方法は何ですか? では、なぜ逆にコンパイルされるのでしょうか?
この MSDN リンクを確認できます: delete[N] operator。値は無視されます。
編集 VC9でこのサンプルコードを試しました:
int test()
{
std::cout<<"Test!!\n";
return 10;
}
int main()
{
int* p = new int[10];
delete[test()] p;
return 0;
};
出力は次のとおりです。
したがって、式は評価されますが、戻り値は無視されます。控えめに言っても驚いています。なぜこれが必要なのか、シナリオが思い浮かびません。
delete [N] array
無効です。C++ 標準では定義されていません。セクション 5.3.5 では、削除式を or のいずれdelete expr
かdelete [] expr
として定義しており、他には何も定義していません。gcc (バージョン 4.1.2) ではコンパイルできません。Visual C++ でコンパイルする理由については、Microsoft にお問い合わせください。
delete[] array;
正しい形式です。
2番目のケースが正しいかどうかにかかわらず、エラーが発生しにくいため、最初のケースを使用することをお勧めします。
Visual Studioは、すべきでない多くのことをコンパイルします。
正しい方法は行うことですdelete[] array;
。delete[N] array;
私はコンパイルすることすら知りませんでした(そして私はそれがすべきだとは思えません)。
最初のポイント: new または delete の配列形式を使用して開始する正当な理由はほとんどありません。代わりに std::vector (または他のコンテナー) を使用してください。
2 番目: C++ の暗黒時代に戻ると、削除する配列のサイズを指定する必要があったため、 を使用した場合x = new T[N]
、一致する削除は でしたdelete [N] x
。サイズを明示的に指定する必要性はずっと前に削除されましたが、一部のコンパイラ (特に古いコードとの下位互換性を気にするもの) ではまだ許可されています。
古いコンパイラ (20 年ほど前のもの) との互換性を維持する必要がある場合を除き、使用しないでください。繰り返しになりますが、コンパイラとの互換性を維持する必要があり、標準のコンテナーをサポートしていない古いコンパイラーとの互換性を維持する必要がない限り、最初から new または delete の配列形式を使用するべきではありません。やめて!
機能する場合、それは非標準の拡張機能です。
delete [] array;
が正しい形です。
delete array;
動作することもありますが、実装に依存します (したがって間違っています)。