C++:新放置与自己的新重载发生冲突

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

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

new (ptr) X();

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

似乎我的 new 运算符重载类型阴影放置 new。至少,编译器会提示:

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*& 吗?

最佳答案

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

关于C++:新放置与自己的新重载发生冲突,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12215029/

相关文章:

c++ - 使用 Crypto++ 的 Salsa20

c++ - 关于 operator new 重载和异常的问题

c++ - 在 C++ 中用类型为 'double' 的乘数将复数对象与实部和虚部相乘

c++ - 全局 new 和 delete 运算符的定义

c++ - 为什么这个析构函数不必删除类对象?

c++如何使用另一个ctor的ctor?

c++ - 表达式模板和C++ 11

c++ - 如何正确重载 << 运算符?

c++ - 为什么不能将一个类的常量实例与同一类的非常量实例进行比较?

c++ - 重载 C++ 赋值运算符的最佳方法