关于new运算符重载的问题?

我是一名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 会使代码进入循环?

阅读 640
3 个回答
void* operator new(size_t size)  // <---- 这个就是所谓的 "operator new 函数"
{
    cout << "new" << endl;
    return operator new(size);
}

所有的重载了的运算符,(几乎)都可以用函数的方式(等价地)调用的。

比如 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 ,其实指的也是重载这个内存分配函数。它本身就是一个函数。

重载Oprator+符号,再调用oprator+函数,是不是也会一样陷入死循环呢

其中主要代码如下: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 会使代码进入循环?operator new函数重载new
(1)1operator new虽然特殊,但它也是函数,你把它当成一个全局类的一个虚函数,你就明白为什么了。void* operator new(size_t size) //针对new+对象
{

cout << "new" << endl;
return operator new(size);

}
就可以被认为是:void* newsth(size_t size) //针对new+对象
{

cout << "new" << endl;
return newsth(size);

}

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题