我多次被告知“new-expression 将调用operator new来管理动态存储并同时初始化对象”。我对此毫不怀疑。但我想知道,既然operator new是在标准库 header 中声明的<new>,即使我们不包含头文件,我们如何仍然使用 new-expression 。
是operator newC++ 核心语言的一部分还是编译器<new>隐式包含的?
是的operator new,是标准的一部分。该实现需要在程序中的每个翻译单元的全局范围内为操作员提供服务。来自[basic.stc.dynamic]/2
该库提供了全局分配和释放函数的默认定义。一些全局分配和释放函数是可以替换的(18.6.1)。C++ 程序最多应提供一个可替换分配或释放函数的定义。任何此类函数定义都会替换库中提供的默认版本 (17.6.4.6)。以下分配和释放函数(18.6)在程序的每个翻译单元的全局范围内隐式声明。
Run Code Online (Sandbox Code Playgroud)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[]。