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

What are "::operator new" and "::operator delete"?

本文关键字:operator delete new 什么      更新时间:2023-10-16

我知道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);
什么是"::

运算符新"和"::运算符删除"?它们与newdelete关键字不同吗?

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 关键字调用运算符 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*)

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

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

它们是分配器和解除分配器函数。 new运算符执行的操作两件事:它调用分配器函数来获取内存,以及它调用对象的构造函数。 delete运算符也这样做两件事:它调用析构函数,然后调用 A Deallocator功能。 默认分配器函数为 ::operator new ,并且默认的解除分配器功能是 ::operator delete 。 两者都可以是由用户替换。

请注意,在新表达式中,查找 ::operator new 函数或多或少以与正常方式相同的方式向上从成员函数中调用的函数。 至于正常功能,您可以限定操作员更改查找:new MyClass将查找成员operator new如果有; ::new MyClass将使用默认分配器,即使MyClass定义了成员operator new

::表示只是一个全局命名空间