単一のキーワードを使用して配列の削除を実装するのは難しいですか?効率が悪いですか?
4 に答える
まず、両方が行うことを要約します。1 つのオブジェクトdeleteのデストラクタを呼び出し、メモリの割り当てを解除します。いくつかのオブジェクトのデストラクタを呼び出し、メモリの割り当てを解除します。delete[]
これらを同じ操作に折りたたむことができます: 「いくつかのオブジェクトのデストラクタを呼び出し、メモリの割り当てを解除します。」. 結局のところ、1は何らかの数です。
と の両方がポインターdeleteを操作します。delete[]このように:
foo* ptr;
よく見てください。そして、デストラクタをいくつ呼び出す必要があるか教えてくださいdelete。できません。そして、コンパイラはできません。これは、実行時にのみ知ることができます。オブジェクトの数に関する情報は、どこかに保存する必要があります。つまり、 を使用するたびにnew[]、その数を追跡するために追加のメモリが割り当てられます。
C++ は、「使用しないものにはお金を払わない」という原則に基づいて構築されています。そのため、非配列形式が存在します。delete常に 1 つのオブジェクトのみを削除newするため、余分に割り当てる必要はありません。
問題は複雑さではなく、への引数deleteが単一のポインターであり、その型が単一の要素または配列のどちらを割り当ててもまったく同じであるという事実です。破壊される要素の数が異なるため、実装の下ではかなり異なります。
これは、実際には C との後方互換性の問題です...もしそれが最初から要件でなかったら、おそらく C++ を持っていなかったでしょう (それほど追いつかなかったでしょう) new T[N]。 ofnew Tと型システムを使用して、どちらをdelete呼び出す必要があるかを検出できます。
それは、C++ 設計の最も重要な原則の 1 つは、使用しないものにはお金を払わないということだからです。 new[]/delete[]には余分なコストがかかり、それらのユーティリティ (25 年間の C++ で使用したことはありません) は十分に制限されているため、このコストを配列以外のnew/に追加することは正当化できないと感じられましたdelete。
このような機能は、実装が簡単であれば、言語イベントから削除することはできません。そのような変更の後、私のコードをすべて修正するボランティアをしてくれますか?