什么是“:: new运算符”和“:: delete操作符”?(What are “::operato

2019-06-24 06:57发布

我知道newdelete的关键字。

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操作符”? 他们是从不同的newdelete关键字?

Answer 1:

::告诉编译器调用全局命名空间中定义的运营商。
它是全球的完全限定名newdelete操作员。

需要注意的是一个可以替代全球newdelete运营商以及超载类特定的newdelete运算符 。 所以,可以有两个版本的newdelete在节目运营商。 与范围解析操作的全名告诉你指的是运营商,而不是特定类的人的全球版本的编译器。



Answer 2:

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*)



Answer 3:

::意味着只是一个全局命名空间



Answer 4:

他们是分配器和释放器功能。 在new运营商做了两两件事:它会调用分配函数来获得内存,并调用该对象的构造函数。 该delete操作员还做了两两件事:调用析构函数,然后调用一个释放器功能。 默认的分配器函数是::operator new ,默认释放器功能::operator delete 。 既可以由用户来代替。

需要注意的是在一个新的表达式中, ::operator new功能是在或多或少的相同方式查找,因为这将是如果它是从一个成员函数内调用的正常功能。 至于正常功能,你可以有资格操作员更改查找: new MyClass会找到一个成员operator new如果存在; ::new MyClass将使用默认的分配,即使MyClass定义成员operator new



文章来源: What are “::operator new” and “::operator delete”?