C++中operator new的实现位置与重载机制疑问
关于C++中operator new的两个常见疑问解答
1. 默认operator new的定义位置与不同场景的行为
- 未包含任何标准头文件时:
C++标准规定operator new是全局作用域的内置函数,编译器会隐式识别它的声明,无需额外头文件。此时调用的是编译器/运行时库提供的内置默认版本,这个版本由编译阶段自动关联到运行时库核心模块,不会出现在你的源码文件中。比如MSVC环境下,它会链接到CRT的基础实现部分。 - 包含
<iostream>等标准头文件后:
多数标准头文件会间接引入平台对应的内存管理头文件(比如MSVC的vcruntime_new.h、GCC的<new>),这些头文件会显式声明全局operator new。此时编译器使用的是头文件声明的版本,本质和内置默认版本是同一个运行时库实现,只是因为头文件的显式声明,编译器会优先处理这个显式声明的实体。
2. 全局自定义operator new为何能覆盖标准版本且无歧义
这是由C++的名字查找和重载决议规则决定的:
- 你自定义的
void* operator new(std::size_t)和标准库的全局版本签名完全一致。 - 在全局作用域定义该函数后,编译器查找
operator new时,会优先匹配当前编译单元中显式定义的你的版本,而非头文件声明的外部标准库版本。 - 此外,C++标准明确允许用户在全局作用域替换默认的
operator new——用户提供的全局版本会直接覆盖标准库的默认实现,链接阶段也会优先使用你的定义,因此不会产生歧义。
内容的提问来源于stack exchange,提问作者CPPL
相关产品推荐
相关产品推荐

