这可能是一个愚蠢的问题,因为我对 C++ 中运算符的实现还很陌生......
我使用
new
运算符/表达式/关键字有一段时间了。但我刚刚注意到有一个函数叫做operator new
。据我所知,在大多数情况下,new
运算符首先调用“默认”operator new
为需要创建的对象分配原始内存,然后调用对象的构造函数来创建对象那个记忆。我们可以在全局范围或类中覆盖默认值 operator new
。
我想知道(默认)
operator new
是在哪里定义的。一方面,我不认为它是在 std
中定义的,因为如果我这样做:
std::operator new(42);
视觉工作室说
namespace "std" has no member "operator new"
。此外,当我既不包含任何标准标头也不包含 operator new(42);
时,using namespace std;
也会成功运行。
另一方面,我发现如果我这样做:
include <iostream>
int main() { operator new(42); }
Visual Studio 然后告诉我,我正在使用的
operator new
如下:
_NODISCARD _Ret_notnull_ _Post_writable_byte_size_(_Size) _VCRT_ALLOCATOR
void* __CRTDECL operator new(
size_t _Size
);
在
vcruntime_new.h
中声明(又由 include
<new>
)。然而,如果我注释掉 include <iostream>
,Visual Studio 会告诉我我正在使用以下内容:
void *operator new(unsigned long long)
哪个
is not located in a source code file.
所以我认为
operator new
与标准库有关。谁能澄清一下在这些情况下 operator new
到底发生了什么?
我感到困惑的另一件事是,如果程序以某种方式包含
vcruntime_new.h
,那么我可能会猜测编译器认为 void* __CRTDECL operator new
在全局范围内。现在,如果我们在全局范围内定义自己的void* operator new(std::size_t);
,编译器会选择使用我们定义的operator new
,而不是vcruntime_new.h
中定义的,并且不会产生歧义。请问这是如何实现的?
检查此内容以获取源代码!
Program Files\Microsoft Visual Studio\2022\Community\VC\Tools\MSVC\14.37.32822\crt\src\vcruntime