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
关键字调用 operator 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*)
.