7

私がした後、言う

Foo* array = new Foo[N];

私はいつもこの方法で削除しています

delete[] array;

しかし、時々私はそれをこのように見ました:

delete[N] array;

コンパイルして動作するように見えるので (少なくとも msvc2005 では)、私は疑問に思います: それを行う正しい方法は何ですか? では、なぜ逆にコンパイルされるのでしょうか?

4

7 に答える 7

13

この 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;
};

出力は次のとおりです。

したがって、式は評価されますが、戻り値は無視されます。控えめに言っても驚いています。なぜこれが必要なのか、シナリオが思い浮かびません。

于 2009-11-17T10:53:10.167 に答える
10

delete [N] array無効です。C++ 標準では定義されていません。セクション 5.3.5 では、削除式を or のいずれdelete exprdelete [] exprとして定義しており、他には何も定義していません。gcc (バージョン 4.1.2) ではコンパイルできません。Visual C++ でコンパイルする理由については、Microsoft にお問い合わせください。

于 2009-11-17T10:51:13.217 に答える
5

delete[] array;正しい形式です。

于 2009-11-17T10:44:04.417 に答える
5

2番目のケースが正しいかどうかにかかわらず、エラーが発生しにくいため、最初のケースを使用することをお勧めします。

Visual Studioは、すべきでない多くのことをコンパイルします。

于 2009-11-17T10:44:14.637 に答える
4

正しい方法は行うことですdelete[] array;delete[N] array;私はコンパイルすることすら知りませんでした(そして私はそれがすべきだとは思えません)。

于 2009-11-17T10:44:06.773 に答える
4

最初のポイント: new または delete の配列形式を使用して開始する正当な理由はほとんどありません。代わりに std::vector (または他のコンテナー) を使用してください。

2 番目: C++ の暗黒時代に戻ると、削除する配列のサイズを指定する必要があったため、 を使用した場合x = new T[N]、一致する削除は でしたdelete [N] x。サイズを明示的に指定する必要性はずっと前に削除されましたが、一部のコンパイラ (特に古いコードとの下位互換性を気にするもの) ではまだ許可されています。

古いコンパイラ (20 年ほど前のもの) との互換性を維持する必要がある場合を除き、使用しないでください。繰り返しになりますが、コンパイラとの互換性を維持する必要があり、標準のコンテナーをサポートしていない古いコンパイラーとの互換性を維持する必要がない限り、最初から new または delete の配列形式を使用するべきではありません。やめて!

于 2009-11-17T15:01:31.387 に答える
-2

機能する場合、それは非標準の拡張機能です。

delete [] array;   

が正しい形です。

delete array; 

動作することもありますが、実装に依存します (したがって間違っています)。

于 2009-11-17T11:50:45.250 に答える