引言
在前几天的完成一个功能的时候需要用到重载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 */
是因为为了跨平台