' operator new '是否是c++核心语言的一部分?

Is `operator new` a part of C++ core language?

本文关键字:语言 一部分 是否是 operator new c++ 核心      更新时间:2023-10-16

我多次被告知"new-expression将调用operator new来管理动态存储并同时初始化对象"。我对此毫不怀疑。但我想知道,既然operator new是在标准库头<new>中声明的,即使我们不包括头文件,我们怎么还能使用new-expression呢?

operator new是c++核心语言的一部分还是编译器隐式包含<new> ?

operator new是标准的一部分。实现需要在程序中的每个翻译单元的全局作用域中提供操作符。从[basic.stc.dynamic]/2

标准库提供了全局分配和释放函数的默认定义。一些全局分配和重分配函数是可替换的(18.6.1)。一个c++程序最多只能提供一个可替换的分配函数或重分配函数的定义。任何这样的函数定义都将替换库中提供的默认版本(17.6.4.6)。下面的分配和释放函数(18.6)在程序的每个翻译单元的全局作用域中隐式声明:

void* operator new(std::size_t);
void* operator new[](std::size_t);
void operator delete(void*);
void operator delete[](void*);
void operator delete(void*, std::size_t) noexcept;
void operator delete[](void*, std::size_t) noexcept;

<>共舞,强调我的

这就是为什么你不需要包含任何东西来使用new/new[]delete/delete[]

是的,operator new是c++标准的一部分。

看到[expr.new] .

大部分#include <new>是隐式声明的。但是#include <new>声明了operator new的一些版本,它们不是隐式的,例如位置new*:

void* operator new  (std::size_t size, void* ptr) noexcept;
void* operator new[](std::size_t size, void* ptr) noexcept;

* 不建议日常使用。

我同意,这往往令人困惑,但在c++中有很多新闻(双关语):

    其中之一是"new操作符"
  1. 另一个是"operator new "一个实际分配内存的函数
  2. 有位置new
  3. ,有些人可能不喜欢这个名字,但也有数组new s (new[])

不考虑3,4,因为它们值得自己发布("位置新"有什么用?)和我如何在c++中使用数组?),第一个("new操作符")驻留在全局命名空间中,并且可以使用范围解析操作符(::)访问它,第二个是您可以在类中重载的操作符。然而,关于这两者的关系,在MSDN (https://msdn.microsoft.com/en-us/library/kewsb8ba.aspx)中有一个很好的解释,我只是粘贴在这里:

new操作符调用函数operator new。对于任何类型的数组,以及非类、结构或联合类型的对象,调用全局函数::operator new来分配存储空间。类类型对象可以在每个类的基础上定义自己的operator new静态成员函数。当编译器遇到分配type类型对象的new操作符时,它会调用type::operator new(sizeof(type)),或者,如果没有定义用户定义的operator new,则调用::operator new(sizeof(type))。因此,new操作符可以为对象分配正确的内存量。

头文件只提供全局operator new的所有变体的声明。只要操作符签名正确,您仍然可以在不包含头的情况下重写它们。

默认的分配和释放函数是标准库的特殊组件;它们具有以下独特的属性:

Global:三个版本的new操作符都在全局命名空间中声明,而不是在std命名空间中声明。
隐式:分配版本((1)和(2))隐式声明在c++程序的每个翻译单元中,无论是否包含header。
可替换的:分配版本((1)和(2))也是可替换的:程序可以提供自己的定义,取代默认提供的定义来产生上述结果,或者可以为特定类型重载它。

来源:http://www.cplusplus.com/reference/new/operator%20new/