You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C++全局重载new运算符是否属重定义?签名规则存疑

全局作用域重载C++ new运算符:是重载还是重定义?

全局作用域下定义单参数的operator new(size_t),不是重载,而是直接替换标准库提供的默认实现,这是C++标准专门规定的特殊规则,不违背常规的重载要求。

为什么这不是常规重载?

常规函数/运算符重载要求不同的签名,但对于全局的operator new(size_t),C++标准允许用户提供同签名的版本来覆盖默认逻辑。当你写出这段代码时:

void* operator new(size_t n){
    return malloc(n);
}

编译器会用你的实现完全替代标准库的默认内存分配逻辑,所有全局范围内的new T调用都会触发这个自定义版本。

关于数组new的困惑

数组对应的全局分配函数是operator new[](size_t),规则和单参数operator new完全一致:全局作用域下定义同签名的版本,也是替换默认实现,而非重载。只有当你为new添加额外参数时,才属于常规的运算符重载:

  • 比如placement new的void* operator new(size_t, void*),或者自定义参数的void* operator new(size_t, int),这些版本的签名和标准单参数版本不同,调用时需要传递对应额外参数来匹配(比如new (buffer) T调用placement new),这才符合你对重载的理解。

总结

  • 单参数的全局operator new和operator new[]是标准允许的重定义替换,不属于重载范畴,所以不存在违背重载规则的问题。
  • 只有带额外参数的new版本,才是常规的运算符重载,遵循“不同签名”的要求。

内容的提问来源于stack exchange,提问作者Aman Sharma

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.20 03:32:08