我重载了类型X
的新运算符以使用一些内存池。我的new
运算符不接受用户定义的参数,因此,唯一的参数是类型为size_t
的对象的大小。在程序的另一部分,我需要相同类型的新位置,比如:
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*&
吗
override TypeName::operator new(size_t)还需要覆盖placement new运算符(不需要相反的运算符)。这就是编译器抱怨的原因。(这很有道理——如果您在分配过程中做了一些奇怪的事情,您可能也希望在placement-new操作符中的指定位置进行操作,反之则不一定正确)。并且X*&只是指向要放置新对象的指针的引用。