3

new()とdelete()がc ++の演算子として実装される用途や理由は何ですか?関数ではなく演算子にすることの利点は何ですか?

4

2 に答える 2

7

型を引数として受け入れるため、new演算子を関数にすることはできません。は値を生成する式ではなく、型名であるnew foo_typeため、関数呼び出しとして記述できません。foo_type

演算子は、deleteさまざまなポインタータイプに対してオーバーロードされる関数、およびセマンティクスboolのための追加のオプションの引数である可能性があります。delete []演算子が存在する理由は、deleteおそらく対応する演算子との対称性のためnewです。

そうは言っても、テンプレート関数は型をテンプレート引数として取ることができます。ただし、newanddelete演算子は、歴史的にテンプレートの前にあります。

また、型の代わりに、オブジェクトが構築される型のプロトタイプインスタンスを受け取る関数を作成することもできます newobj(m_class(constructor_arg))。これnewobjは、さまざまなタイプに対してオーバーロードされます。スペースを割り当て、構成をコピーして、オブジェクトを返します。

つまり、最終的には、デザインはデザイナーの好みや気まぐれを反映しています。

言語設計では、演算子と関数(およびステートメント、宣言など)を分離する必要はありません。

于 2012-11-20T16:38:04.467 に答える
3

人々がそれらを無効にすることを私が知っている2つの一般的な理由があります。

1)new / deleteを使用して、オブジェクトのプールを追跡します。newはプールから最初の未使用のリソースを取得し、deleteはそのリソースをプールに返します。これは、オブジェクトを常に割り当て/割り当て解除する場合に便利です。

2)メモリ使用量の追跡。リークやメモリの上書きの問題を追跡できます。たとえば、どちらかの側でメモリを埋めたり、メモリを割り当てている人を追跡して、割り当てを解除しなかった人を追跡したりできます。

于 2012-11-20T16:38:18.547 に答える