为何重载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
相关产品推荐
相关产品推荐

