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

时间:2011-12-31 00:47:36

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

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

例如

int a = 5;
Monkey* monk = new Monkey(a);

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

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

...

}

由于

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

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

1 个答案:

答案 0 :(得分:13)

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

 Monkey *amonkey = new (1275) Monkey(a);

附加物

Boehm's garbage collector提供了将参数[s]传递给new运算符的实际示例,可让您进行编码

 Monkey *acollectedmonkey = new(UseGc) Monkey(a);

然后你不必担心delete - acollectedmonkey(假设它的析构函数不做奇怪的事情;请参阅this answer)。在极少数情况下,您希望将明确的Allocator参数传递给std::vectorstd::map等模板集合。

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