2016-10-02 4 views
-3

最近のC++コンパイラでは、new[]で割り当てられた配列の長さは、配列の秘密裏に(通常は後ろに)格納されるので、コンパイラは配列の長さを知っていますが、そのメモリを解放するためにdelete[n]を使用するオプションが与えられていますか?配列の角括弧内の値を使用できないのはなぜですか?

C++は、あなたが使用していないものに対してお金を払わないという理想を支持し、配列の長さが何であるかを常に知ることはお勧めです。機能が削除されました。

+5

あなたは 'delete [15] arrname'のようなものが有効で廃止予定の表現であると言っていますか? –

+4

単に 'std :: vector'を使うことができるときに' new [] 'と' delete [] 'を使うのはなぜですか? –

+0

私は 'delete [n]'の利点を理解していますか? – UnholySheep

答えて

0

論理的には、このような機能を削除する最も一般的な理由は、必要ないこと、または誤ったプログラムの動作の可能性を高めることです。

しかし、その論理的な説明は詳細を詳しく説明しています。これについてはここで説明します。

delete []の式が未定義の動作をしないで動作するためには、対応するnew[]式に割り当てられた実際の長さにアクセスできる必要があります。そうでなければ、動的に割り当てられた配列のすべての要素に対してデストラクタ(デストラクタを持つクラス型であると仮定します)を呼び出すことはできません。

最初に、new[]の動作では、割り当てられた長さがメモリに格納されているとします(ここではあなたの単語を使用します)。つまり、delete []式に長さを指定する必要は実質的にありません。実装は関係なく、正しい値にアクセスして使用できます。 delete []の式が長さを指定する場合、実装は正しい値にアクセスできるため無視したり、チェックしたりすることができます。実際には、供給された値が間違っている場合、実装はそれを報告することができます(たとえば、std::cerrにメッセージを書き込んで、abort()に電話する)か無視します(つまり、正しい値を使用します)。いずれにしても、delete[]式で指定された長さをチェックする価値はほとんどありません。

また、実装では、割り当てられた長さを「秘密」に格納しないとします。 2つの可能性があります - 供給された長さは正しいか、そうではありません。指定された長さが正しい場合、delete []式は意図したとおりに動作します(配列要素のデストラクタ呼び出しの正しい数、正しい量のメモリをホストシステムに解放するなど)。指定された長さが正しくない場合、結果は未定義の動作になります(実装は問題を検出できず、それを修正して正しい長さを使用することはできません)。

今、標準は何をすべきですか? 3つの可能性は、delete []式に長さを指定して、長さを指定する(つまりオプションにする)か、長さを指定しないようにすることです。

delete []の式に長さを指定する必要がある場合は、delete[]の式の長さが正しくない場合、未定義の動作以外を指定することはできません。結局のところ、いくつかの実装では、正しい長さを秘密の場所に格納するので(提供された長さを無視することができます)、値が正しいかどうかを確認できません(つまり、delete []の式長さが間違っています)。開発者は、信頼性の高い動作を得るためには実装の品質の問題に頼っているでしょう。

delete []の式で長さを指定することが許可されている場合は、delete []式が式を提供しなかった場合に正しく機能するように、実装は正しい位置で正しい長さを切り取る必要があります。長さ実際には、ほとんどの実装では、指定された長さが無視されるため、delete []式を供給する必要はありません。しかし、デベロッパーや言語弁護士は、彼らが長けているかどうかを問わず、長さをdelete []の式で指定する必要があるかどうかについて数多くの議論があり、結論は重要ではありません。このような議論は、パンツにとっては楽しいかもしれませんが、初心者にとってはC++への混乱の原因になります。

最後の可能性は、長さを指定するdelete []の式を禁止することです。これは、実装が「秘密」の場所に長さを格納することを要求するという効果を有する。 delete []式の動作は長さにアクセスし、意図したとおりに動作します。

上記の3つの可能性は、未定義の動作を不必要に許可することになり、開発者が何をするかしないかに関する非生産的な議論を引き起こすか、またはdelete[]式が有効なポインタを与えられれば正しく動作しますnew []の式から取得されている、2回削除されていないなどなど)。

最後のオプション - delete[]の式で指定された長さを許可しない - が最も論理的です。そして、これは標準が指定しているものである.....

唯一のトレードオフは、歴史を見ている人がいる(古い仕様DIDでは、長さをdelete[]の式で指定する必要があります)。説明...答えられる質問のために帯域幅や脳力を消費する。ここでは不思議なことだ。しかし、世界は決して完璧ではないので、我々は皆それで生きています。

+0

Aha。最後に、あなたは "(古い仕様では、長さをdelete []式で指定する必要があります)"と言っています。それは興味深いことではありません。 –

関連する問題