9

インタビューの質問: "new" 演算子と "new" 関数の違いは何ですか?

私は違いはないと答えました。同じコードを実行しているからです。

それは間違った答えですか?それともインタビュアーは私とただゲームをしていたのですか?

もしそれが間違った答えなら、正しい答えは何ですか?

カスタム割り当てが必要な場合は「new」演算子をオーバーロードできると続けましたが、彼はそれをオーバーロードする方法を知りたがっていました。もちろん、その必要がなかったので、その答えはありませんでしたが、10分で調べることができると彼に言いました(インタビューでは決して正しい答えではありません).

とにかく、「新しい」演算子と「新しい」関数についていくつかの調査を行い、本当に満足のいく答えが見られなかったので、特定の質問をしたいと思いました。

4

5 に答える 5

16

new演算子 とはoperator new同じものではありません。

new演算子は関数を呼び出してメモリoperator newを割り当て、割り当てられた型と使用される構文に応じて、割り当てられたメモリのコンストラクターを初期化または呼び出します。つまり、オペレーターoperator newの操作の一部を形成するだけnewです。

operator newnewオペレーターがメモリーを割り当てるために呼び出される関数です。operator newwhich can be replaceのデフォルトの実装がありますが、これはオーバーロードと同じではありません。また、特定の型operator newに対して実装して、その型のオブジェクトのみの割り当てを処理することも、オーバーロードすることもできます。オーバーロードは、配置の新しい形式の演算子を使用して選択できます。operator newnew

のデフォルトの実装はoperator new、次のシグネチャを使用して関数を定義することで置き換えることができます。

void *operator new(std::size_t size);
void *operator new(std::size_t size, const std::nothrow_t&);
void *operator new[](std::size_t size);
void *operator new[](std::size_t size, const std::nothrow_t&);

の置換またはオーバーロードをoperator new提供する場合は、対応するoperator delete関数を提供する必要があります。

void operator delete(void* ptr) noexcept;
void operator delete(void* ptr, const std::nothrow_t&) noexcept;
void operator delete[](void* ptr) noexcept;
void operator delete[](void* ptr, const std::nothrow_t&) noexcept;

operator new演算子の配置形式で使用するために のオーバーロードを提供するにはnew、追加の引数を追加できます ( の非スロー バージョンoperator newとこれをoperator delete行います)。

struct my_type {};

void *operator new(std::size_t size, const my_type&);
void operator delete(void *ptr, const my_type&);

new (my_type()) int(10); // allocate an int using the operator new that takes a my_type object

deleteオペレーターの「配置削除」形式はありません。のオーバーロードoperator deleteが提供されるのは、メモリの初期化/構築中にエラーが発生した場合 (たとえば、 が呼び出されたnew後に演算子によって呼び出されたコンストラクターoperator new)、対応するoperator deleteが存在する場合は、例外を再スローする前に呼び出されるためです。それ以外の場合operator deleteは呼び出されず、例外がスローされるとメモリ リークが発生します。

于 2012-08-12T08:49:44.393 に答える
1

基本的に:-機能:「新しいオペレーター」

 class Example 
{ public:
         void* operator new( size_t );
 }

「新しい演算子」:

Example* eg = new Example();
于 2012-08-12T07:35:22.913 に答える
1

カスタム割り当てが必要な場合は、「new」演算子をオーバーロードできると続けました

あなたはほとんど正しいです。 newメモリ割り当てに使用される演算子のキーワードです。

なぜこれは演算子なのですか? 必要に応じて、グローバル スコープまたはクラス スコープの両方
で 関数としてオーバーロードできます(ただし、スコープではありません!)。関数だったらありえない。namespace

于 2012-08-12T07:47:53.880 に答える
0

違いは、それらがどのように機能するかです。最初の割り当て部分は、私が信じている標準では同じです。つまり、構文 new と operator new() を明示的に使用することは、ほとんど同じです。違いは、 new を使用して新しいオブジェクトを初期化または構築することです。::operator new() にも 3 つの異なるバージョンがあり、それらを利用するためのさまざまな構文もあります (つまり、placement new)。

于 2012-08-12T07:48:14.843 に答える
0

新しい機能はありません。私の推測では、これらの 1 つがメモリを割り当て (標準ではallocator functionfunction new operator、およびnew operatorを使用)、もう 1 つは最初にメモリを割り当ててからコンストラクタ (標準のコンストラクターが例外で終了した場合、メモリを解放するためにnew expression ) とdeallocator関数 (別名function delete operatorまたはdelete operator ) を使用します。

于 2012-08-12T07:52:23.360 に答える