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

为何重载operator new会改变new[]的行为?VS2015代码疑问解析

为什么重载operator new会影响new[]的行为?

这个问题其实涉及到C++标准里关于内存分配函数的默认绑定规则,我来给你拆解清楚:

首先先贴出你的代码方便对照:

#include<iostream>
using namespace std;
class A {
public:
    A(int _a,int _b){}
    //func1
    void* operator new(size_t sz) {
        cout << "func1"<<endl;
        return malloc(sz);
    }
};
//func2
void* operator new(size_t sz) {
    cout << "func2" << endl;
    return malloc(sz);
}
int main() {
    int* i = new int;//正常,调用func2
    int* i1 = new int[6];//为何调用func2而非隐式默认的operator new[]?
    A *a = new A(1, 2);//正常,调用func1
}

核心逻辑:new[]的“回退”机制

C++标准规定:当你没有显式重载对应作用域下的operator new[]时,new[]表达式会自动调用同作用域下的operator new来完成内存分配。

具体到你的代码场景:

  • 对于new int[6]:你只重载了全局的operator new(也就是func2),但没有重载全局的operator new[]。这时编译器不会使用默认的隐式operator new[],而是直接复用你已经重载的全局operator new,把数组所需的总内存(包括可能的元数据空间,用来记录数组长度)作为sz参数传进去。
  • 这里要注意:像int这种没有析构函数的内置类型,编译器可能会优化掉元数据的存储,但分配逻辑还是会走operator new。

再延伸到自定义类的情况

如果你的类A没有重载operator new[],当你写new A[5]时,会优先调用类专属的operator new(也就是你的func1),而不是全局的func2。只有当类里没有任何operator new重载时,才会回退到全局的分配函数。

如何让new[]调用专属的分配函数?

如果你想让new[]使用独立的分配逻辑,只需要显式重载对应的operator new[]即可。比如给全局作用域加一个:

void* operator new[](size_t sz) {
    cout << "func3 (global operator new[])" << endl;
    return malloc(sz);
}

这时再运行new int[6],就会调用func3而不是func2了。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 08:04:04