重载new运算符:数组内存大小如何传递给size_t参数?
解答:C++ new运算符重载与数组类型参数的疑问
问题1:new int[3]的大小如何传递给重载的operator new?
当你执行new int[3]创建数组时,编译器会自动帮你完成两个关键操作:
- 首先计算数组的总字节大小:
3 * sizeof(int)(在常见系统中sizeof(int)为4,所以总大小是12字节) - 然后把这个计算好的总大小,作为
size_t类型的参数,自动传递给你重载的void* operator new(size_t size)函数
简单来说,new[]表达式的底层逻辑是:先调用operator new分配足够容纳整个数组的内存(就是这个总字节数),再对数组元素进行初始化(对于int这类内置类型是默认初始化)。你在重载函数里拿到的size参数,就是编译器帮你算好的数组总内存大小。
另外提个小细节:你的代码里用new[]分配的内存,应该对应使用delete[]释放,而不是delete。虽然内置类型数组可能不会立刻触发错误,但这是违反C++标准的写法,一旦换成自定义类对象数组,很可能会导致内存泄漏或未定义行为。
问题2:为什么sizef(int[5])无法运行?
这里的核心错误是把类型当成数值传递给函数了:
int[5]是一个数组类型,而你的sizef函数需要的是size_t类型的数值参数,编译器无法直接将一个类型转换为数值,所以会报错。
如果你想传递int[5]数组的总字节大小,需要用sizeof运算符计算这个类型的大小,再把结果传进去。正确的写法是:
sizef(sizeof(int[5]));
sizeof(int[5])会返回5 * sizeof(int)的数值(通常是20),这才是sizef函数期望的size_t类型参数。
内容的提问来源于stack exchange,提问作者srilakshmikanthanp
相关产品推荐
相关产品推荐

