使用单独的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函数,然后调用对象构造函数。
为了将内存分配与对象构造分离,声明了operator 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
使用operator delete(void*)
代替delete p
;前者会先调用析构函数,然后再调用operator delete(void*)
。
new
头文件。 - Amir Saniyannew MyType
还是:: new MyType
,标准非放置new都不需要它,并且如果您的new
表达式解析为用户定义的operator new
,而不是标准库中的一个,则不需要它。 - James Kanze