8

私は知っnewdeleteいて、キーワードです。

int obj = new int;
delete obj;

int* arr = new int[1024];
delete[] arr;

<new>ヘッダーはC++標準ヘッダーの一部です。2つの演算子があります(演算子であるか関数であるかはわかりません)。

::operator new

::operator delete

これらの演算子は次のように使用されます。

#include <new>
using namespace std;

int* buff = (int*)::operator new(1024 * sizeof(int));
::operator delete(buff);

「::operatornew」と「::operatordelete」とは何ですか?それらはキーワードnewとは異なりますか?delete

4

4 に答える 4

14

キーワード (単独でnew使用) は関数と同じではありませんoperator new

通話中

Object* p = new Object(value);

呼び出しで同等です

void* v = operator new(sizeof(Object));
p = reinterpret_cast<Object*>(v);
p->Object::Object(value); //this is not legal C++, it just represent the implementation effect

演算子 new (またはより良いvoid* operator new(size_t)バリアント) はメモリを割り当てるだけで、オブジェクトの構築は行いません。

キーワードはnew演算子 new 関数を呼び出しますが、その後でオブジェクト コンストラクターを呼び出します。

割り当てを構築から分離するために、演算子 new のバリアントは次のように宣言されます。

void* operator new(size_t, void* at)
{ return at; }

通常、前のコードは次のように記述されます。

Object* p = reinterpret_cast<Object*>(operator new(sizeof(Object))); //no contruction here
new(p) Object(value); //calls operator new(size_t, void*) via keyword

自体はoperator new(size_t, void*)何もしませんが、キーワードによって呼び出されると、コンストラクターが呼び出されます。

逆に、破棄と解放は次のように分離できます。

p->~Object();
operator delete(p); //no destructor called

の代わりにdelete p; デストラクタを呼び出してからoperator delete(void*).

于 2012-05-09T10:31:25.270 に答える
11

::グローバル名前空間で定義された演算子を呼び出すようにコンパイラに指示します。
これは、グローバルnewおよびdelete演算子の完全修飾名です。

グローバルなand演算子を置き換えたり、クラス固有のand演算子newdeletenewdeleteをオーバーロードしたりできることに注意してください。したがって、プログラムには 2 つのバージョンのnewanddelete演算子が存在する可能性があります。スコープ解決演算子を含む完全修飾名は、クラス固有のものではなく、演算子のグローバル バージョンを参照していることをコンパイラに伝えます。

于 2012-05-09T09:36:25.993 に答える
4

それらは、アロケーターおよびデアロケーター関数です。オペレーターは 2 つのnewことを行います。メモリを取得するためにアロケーター関数を呼び出し、オブジェクトのコンストラクターを呼び出します。このdelete演算子は、デストラクタを呼び出し、次にデアロケータ関数を呼び出します。デフォルトのアロケータ関数は::operator newで、デフォルトのデアロケータ関数は です::operator delete。どちらもユーザーが交換できます。

new 式では::operator new、メンバー関数内から呼び出される通常の関数の場合とほぼ同じ方法で関数が検索されることに注意してください。通常の関数と同様に、演算子を修飾してルックアップを変更できます。メンバーが存在する場合はnew MyClassメンバーを検索します。member が定義されていても、デフォルトのアロケータが使用されます。operator new::new MyClassMyClassoperator new

于 2012-05-09T09:57:27.170 に答える
3

::単なるグローバル名前空間を意味します

于 2012-05-09T09:37:09.180 に答える