キーワード (単独で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*)
.