16

C ++では、配列を動的に割り当てる場合は、次のように実行できます。

int *p;
p = new int[i];  // i is some number

ただし、アレイを削除するには、次のようにします...

delete[] p;

なんでじゃないのdelete p[]?それは最初に作成された方法とより対称的ではないでしょうか?言語がこのように設計された理由(もしあれば)は何ですか?

4

2 に答える 2

29

1つの理由は、これらのケースをより明確にすることである可能性があります。

int ** p;
delete[] p
delete p[1];

もしそうならdelete p[]、1文字のエラーはかなり厄介な結果をもたらすでしょう。

于 2012-06-26T07:08:59.557 に答える
2

関数(または演算子)にパラメーターとして渡すと、配列がポインターに減衰するためです。したがって、deletep[]は単にdeletepと同等です。

[編集] 特別なテンプレート演算子として削除を考えるかもしれません。演算子は、pとp []を区別して、適切な「特殊化」(非配列または配列の削​​除)を選択できる必要があります。ただし、テンプレート引数の推定ルールにより、この選択は不可能になります(配列が減衰するため、引数を推定するときにp []とpを区別できません)。

したがって、両方の場合に名前deleteの演算子を使用することはできず、配列の場合には別の名前の演算子delete []を導入する必要があります(サフィックス[]は演算子の名前の一部として扱うことができます)。

[編集2]注。現在の標準では、deletep[]はまったく有効なsintaxではありません。上記の理由は、既存のc++の概念を使用してdeletep[]を解釈しようとした場合に発生する可能性のある問題のみを示しています。

于 2012-06-26T09:51:01.553 に答える