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

是因为为了跨平台

参考资料:
博客
论坛

posted @ 2022-07-02 13:18  李兆龙的博客  阅读(173)  评论(0编辑  收藏  举报