我知道new
和delete
的关键字。
int obj = new int;
delete obj;
int* arr = new int[1024];
delete[] arr;
<new>
头是C ++标准报头的一部分。 它有两个运营商(我不知道他们是经营者或他们的功能):
::operator new
::operator delete
这些运算符使用象下面这样:
#include <new>
using namespace std;
int* buff = (int*)::operator new(1024 * sizeof(int));
::operator delete(buff);
什么是“:: new运算符”和“:: delete操作符”? 他们是从不同的new
和delete
关键字?
::
告诉编译器调用全局命名空间中定义的运营商。
它是全球的完全限定名new
和delete
操作员。
需要注意的是一个可以替代全球new
和delete
运营商以及超载类特定的new
和delete
运算符 。 所以,可以有两个版本的new
和delete
在节目运营商。 与范围解析操作的全名告诉你指的是运营商,而不是特定类的人的全球版本的编译器。
的new
关键字(单独使用)是不一样的operator new
功能。
调用
Object* p = new Object(value);
在调用等同放着清单
void* v = operaor new(sizeof(Object));
p = reinterpret_cast<Object*>(v);
p->Object::Object(value); //this is not legal C++, it just represent the implementation effect
运营商新的(或更好的void* operator new(size_t)
变体)刚刚分配内存,但没有做任何对象的构造。
在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
代替delete p
; 调用析构函数,然后operator delete(void*)
他们是分配器和释放器功能。 在new
运营商做了两两件事:它会调用分配函数来获得内存,并调用该对象的构造函数。 该delete
操作员还做了两两件事:调用析构函数,然后调用一个释放器功能。 默认的分配器函数是::operator new
,默认释放器功能::operator delete
。 既可以由用户来代替。
需要注意的是在一个新的表达式中, ::operator new
功能是在或多或少的相同方式查找,因为这将是如果它是从一个成员函数内调用的正常功能。 至于正常功能,你可以有资格操作员更改查找: new MyClass
会找到一个成员operator new
如果存在; ::new MyClass
将使用默认的分配,即使MyClass
定义成员operator new
。