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

重载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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.14 08:58:11