C ++:Placement new碰撞自己的新重载

时间:2012-08-31 12:05:38

标签: c++ operator-overloading new-operator placement-new

我为类型X重载了新运算符以使用一些内存池。我的new运算符不使用用户定义的参数,因此,唯一的参数是size_t类型的对象的大小。在程序的另一部分,我需要为同一类型放置new,如下所示:

new (ptr) X();

(其中ptr是指向预分配内存位置的指针)

似乎我的新操作符的重载类型阴影放置新。至少,编译器抱怨:

error: no matching function for call to ‘X::operator new(long unsigned int, X*&)’
note: candidate is:
note: static void* X::operator new(size_t)
note:   candidate expects 1 argument, 2 provided

候选人是我对新运营商的超载。我的问题是:

  • 为什么编译器没有意识到我想使用placement new?
  • 我怎么能用它?
  • WTF是错误消息中显示的类型X*&

1 个答案:

答案 0 :(得分:2)

重写TypeName :: operator new(size_t)要求您也覆盖placement new运算符(不需要相反)。这就是编译器抱怨的原因。 (有道理 - 如果你在分配期间做了一些奇怪的事情,你可能也希望在placement new运算符的指定位置执行此操作,反之则不一定正确)。 和X *&只是对你想要新对象的指针的引用。