什么是":: operator new"和":: operator delete"?

Ami*_*yan 1 c++ new-operator delete-operator operator-keyword

我知道new并且delete是关键词.

int obj = new int;
delete obj;

int* arr = new int[1024];
delete[] arr;
Run Code Online (Sandbox Code Playgroud)

<new>header是C++标准头文件的一部分.它有两个运算符(我不确定它们是运算符还是函数):

::operator new

::operator delete

这些运算符使用如下:

#include <new>
using namespace std;

int* buff = (int*)::operator new(1024 * sizeof(int));
::operator delete(buff);
Run Code Online (Sandbox Code Playgroud)

什么是":: operator new"和":: operator delete"?它们newdelete关键字不同吗?

Alo*_*ave 9

::告诉编译器调用全局命名空间中定义的运算符。
它是全局newdelete运算符的完全限定名称。

请注意,可以替换全局newdelete运算符以及重载特定于类的newdelete运算符。所以一个程序中可以有两个版本的newanddelete运算符。带有作用域解析运算符的完全限定名称告诉编译器您指的是运算符的全局版本,而不是特定于类的运算符。

  • @AmirSaniyan 如果您希望使用 [placement new](http://www.parashift.com/c++-faq-lite/dtors.html#faq-11.10),那么包含新标题的唯一原因(我知道) (2认同)

Emi*_*lia 7

new关键字(单独使用)是不一样的operator new功能.

调用

Object* p = new Object(value);
Run Code Online (Sandbox Code Playgroud)

在呼召中是等价的

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
Run Code Online (Sandbox Code Playgroud)

操作符new(或更好的void* operator new(size_t)变体)只是分配内存,但不做任何对象构造.

new关键字调用operator new函数,但随后调用对象的构造函数.

为了将分配与构造分开,将operator new的变体声明为

void* operator new(size_t, void* at)
{ return at; }
Run Code Online (Sandbox Code Playgroud)

以前的代码通常写成

Object* p = reinterpret_cast<Object*>(operator new(sizeof(Object))); //no contruction here
new(p) Object(value); //calls operator new(size_t, void*) via keyword
Run Code Online (Sandbox Code Playgroud)

operator new(size_t, void*)在本身并没有什么,但是,通过关键字被调用将导致构造器被调用.

相反,破坏和解除分配可以分开

p->~Object();
operator delete(p); //no destructor called
Run Code Online (Sandbox Code Playgroud)

而不是delete p; 然后调用析构函数operator delete(void*).


Jam*_*nze 6

它们是分配器和解除分配器函数。该new运算符执行两件事:调用分配器函数来获取内存,并调用对象的构造函数。该delete运算符还执行两件事:调用析构函数,然后调用释放函数。默认分配器函数是::operator new,默认释放器函数是::operator delete。两者都可以由用户更换。

请注意,在新表达式中,::operator new查找函数的方式与从成员函数内调用普通函数的方式大致相同。对于普通函数,您可以限定运算符来更改查找:如果存在new MyClass成员,则将查找该成员;即使定义了 member ,也会使用默认分配器。operator new::new MyClassMyClassoperator new