为什么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 */

是因为为了跨平台

参考资料:
博客
论坛

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

李兆龙的博客

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值