我是一名c++初学者,最近学习了 new运算符重载。在相关的文章种看到了关于operator new函数的介绍。
其中主要代码如下:
void* operator new(size_t size) //针对new+对象
{
cout << "new" << endl;
return operator new(size);
}
当运行此代码后,会进入无限循环中
代码改为:
void* operator new(size_t size) //针对new+对象
{
cout << "new" << endl;
return ::operator new(size);
}
文章的解释是 ,我是对new进行的重载,调用opertor new函数会使进入循环,应将opertor new改为全局性质的 ::operator new(size)
我不理解的是,我明明是对new进行的重载,和opertor new函数有啥关系。为啥调用opertor new 会使代码进入循环?
所有的重载了的运算符,(几乎)都可以用函数的方式(等价地)调用的。
比如
a+b
可以是a.operator+(b)
或者是operator+(a,b)
。所以在
operator new()
的定义里调用了operator new
,就递归调用了自己,于是就死循环了。内置运算符对应的“函数”并不一定存在。比如
operator+(1,2)
就会报错。但是重载后的运算符都是函数。operator new
其实跟operator new()
函数并不完全对应。new expresstion 会调用
operator new()
来分配内存,然后还会构造对象。仅调用
operator new()
函数是不会构造对象的。所以其实它只是个内存分配函数(allocation fucntion)。重载 operator new ,其实指的也是重载这个内存分配函数。它本身就是一个函数。