【问题标题】:C++ - overload operator new and provide additional argumentsC++ - 重载 operator new 并提供额外的参数
【发布时间】:2012-01-30 21:51:40
【问题描述】:

我知道您可以重载运算符new。当你这样做时,你的方法会默认发送一个size_t 参数。但是,是否可以将 size_t 参数以及其他用户提供的参数发送到重载的 new 运算符方法?

例如

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

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

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

...

}

谢谢

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

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

【问题讨论】:

  • 虽然这是可能的,但我想知道激励用例是什么。您想将什么作为int 参数传递给new
  • 为什么要超载new?你到底想完成什么?
  • 这很有趣,你将如何为你的对象释放内存?
  • @luskan:你也可以将额外的参数传递给delete,例如传递用于new的相同内存池
  • @BasileStarynkevitch:不,您不能将额外的参数传递给deleteoperator delete 的放置版本仅在构造函数抛出异常时调用。

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


【解决方案1】:

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

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

附录

Boehm's garbage collector 给出了将参数 [s] 传递给 new 运算符的实际示例,它使您能够编写代码

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

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

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

【讨论】:

  • 我不明白,为什么是 (1275) 然后是 (a) 在 Moneky 之后?重载的方法会像我上面的那样吗?
  • 因为new 就是这样工作的。您想将参数传递给new 本身,而不是Monkey。所以(1275) 转到new(a) 转到Monkey 构造函数。
  • 为什么? :因为它是在 C++ 标准中如此定义的(我现在无法访问)。
  • 而且我不会将operator new 称为方法,因为它不是成员函数(它是static,因为它不对实例进行操作)。跨度>
  • 1275只是一个随机数还是有意义?
最近更新 更多