为什么operator new的第一个参数必须是size_t
引言
在前几天的完成一个功能的时候需要用到重载New运算符,但当我写了一个可变模板参数传如默认的new运算符时 以为不会有什么问题的时候却报错,提示第一个参数必须是size_t 顿时百思不得其解
在解决后遂记录一篇博客。
下面是错误代码
template<typename... Args>
static void* operator new(const Args&&... args){
//一些操作
return ::operator new(std::forward<Args>(args)...);
}
报错信息:
‘operator new’ takes type ‘size_t’ (‘long unsigned int’) as first parameter
解决的方法其实就是在参数中加上一个size_t
原因是
#define new new(_FILE, _LINE)
这样我们每次调用new,比如int * ptr = new int;被编译器替换成了int * ptr = new (__FILE, _LINE) int,从而调用我们定义的operator new, 对于数组同样适用,而是在编译的是后由编译器计算出所需要的长度调用我们定义的operator new函数,所以重载new运算符需要时的第一个参数为size_t
其实那个size_t的意思是编译器根据申请对象的类型计算的 就是分配内存的大小,是不需要我们去计算的,
inline void* operator new(std::size_t, void* __p) _GLIBCXX_USE_NOEXCEPT
{ return __p; }
有兴趣可以打印下那个size_t的大小 (还可以顺便复习下字节对齐 ),至于为什么是size_t而不是其他的类型
#ifndef _SIZE_T_DEFINED
#ifdef _WIN64
typedef unsigned __int64 size_t;
#else /* _WIN64 */
typedef _W64 unsigned int size_t;
#endif /* _WIN64 */
#define _SIZE_T_DEFINED
#endif /* _SIZE_T_DEFINED */
是因为为了跨平台
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南