new()とdelete()がc ++の演算子として実装される用途や理由は何ですか?関数ではなく演算子にすることの利点は何ですか?
2 に答える
型を引数として受け入れるため、new
演算子を関数にすることはできません。は値を生成する式ではなく、型名であるnew foo_type
ため、関数呼び出しとして記述できません。foo_type
演算子は、delete
さまざまなポインタータイプに対してオーバーロードされる関数、およびセマンティクスbool
のための追加のオプションの引数である可能性があります。delete []
演算子が存在する理由は、delete
おそらく対応する演算子との対称性のためnew
です。
そうは言っても、テンプレート関数は型をテンプレート引数として取ることができます。ただし、new
anddelete
演算子は、歴史的にテンプレートの前にあります。
また、型の代わりに、オブジェクトが構築される型のプロトタイプインスタンスを受け取る関数を作成することもできます newobj(m_class(constructor_arg))
。これnewobj
は、さまざまなタイプに対してオーバーロードされます。スペースを割り当て、構成をコピーして、オブジェクトを返します。
つまり、最終的には、デザインはデザイナーの好みや気まぐれを反映しています。
言語設計では、演算子と関数(およびステートメント、宣言など)を分離する必要はありません。
人々がそれらを無効にすることを私が知っている2つの一般的な理由があります。
1)new / deleteを使用して、オブジェクトのプールを追跡します。newはプールから最初の未使用のリソースを取得し、deleteはそのリソースをプールに返します。これは、オブジェクトを常に割り当て/割り当て解除する場合に便利です。
2)メモリ使用量の追跡。リークやメモリの上書きの問題を追跡できます。たとえば、どちらかの側でメモリを埋めたり、メモリを割り当てている人を追跡して、割り当てを解除しなかった人を追跡したりできます。