operator new 在哪里以及如何实现?

问题描述 投票:0回答:1

这可能是一个愚蠢的问题,因为我对 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
中定义的,并且不会产生歧义。请问这是如何实现的?

c++ new-operator
1个回答
0
投票

检查此内容以获取源代码!

Program Files\Microsoft Visual Studio\2022\Community\VC\Tools\MSVC\14.37.32822\crt\src\vcruntime
© www.soinside.com 2019 - 2024. All rights reserved.