C++ - 重载operator new并提供其他参数

Kai*_*aan 7 c++ memory-management operator-overloading placement-new

我知道你可以超载操作员new.执行此操作时,size_t默认情况下会为方法发送一个参数.但是,是否可以将size_t参数 - 以及其他用户提供的参数 - 发送到重载的new运算符方法?

例如

int a = 5;
Monkey* monk = new Monkey(a);
Run Code Online (Sandbox Code Playgroud)

因为我想覆盖这样的新运算符

void* Monkey::operator new(size_t size, int a)
{

...

}
Run Code Online (Sandbox Code Playgroud)

谢谢

编辑:这是我想要完成的事情:

我在应用程序的开头(内存池)分配了一大块虚拟内存.继承我的基类的所有对象都将继承其重载的new运算符.我想有时在重载new中传递一个参数的原因是告诉我的内存管理器我是否要使用内存池,或者我是否想用malloc分配它.

Bas*_*tch 13

使用该附加操作数调用new,例如

 Monkey *amonkey = new (1275) Monkey(a);
Run Code Online (Sandbox Code Playgroud)

附加物

将参数[s]传递给new运算符的实际示例由Boehm的垃圾收集器提供,它允许您进行编码

 Monkey *acollectedmonkey = new(UseGc) Monkey(a);
Run Code Online (Sandbox Code Playgroud)

然后你就不必理会delete-ing acollectedmonkey(假设它的析构函数不要做奇怪的事情;看到这个答案).在极少数情况下,您希望将显式Allocator参数传递给模板集合,如std::vectorstd::map.

使用内存池时,通常需要一些MemoryPool类,并将该类的实例(或指向它们的实例)传递给您new 和您的delete操作.出于可读性的原因,我不建议通过一些模糊的整数来引用内存池.

  • 因为这就是"新"的运作方式.您想要将参数传递给`new`本身,而不是`Monkey`.所以`(1275)`转到`new`而``(a)`转到`Monkey`构造函数. (2认同)
  • 为什么?:因为它是在C++标准中定义的(我现在无权访问). (2认同)