如果我超载它,如何调用原始的“operator new”?

时间:2010-11-09 13:35:36

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

假设我需要重载全局::operator new() for storing extra data with each allocated object。所以基本上它会以这种方式工作:

  • 对于对全局::operator new()的每次调用,它将传递对象大小并添加额外数据的大小
  • 分配上一步推导出的大小
  • 的内存块
  • 它将指向未被额外数据占用的块部分的指针,并将该偏移值返回给调用者

::operator delete()将反向移动指针,访问额外数据,释放内存。

现在的问题是如何分配内存?当然我可以调用malloc()或某些特定于平台的函数(通常是这样做的)。但通常当我需要在C ++中分配原始内存时,我会调用::operator new()。我可以调用原始::operator new()从我重载的全局::operator new()内部进行内存分配吗?

1 个答案:

答案 0 :(得分:19)

你无法访问它们,因为它并没有真正超载,而是它的替代品。当您定义自己的::operator new时,旧版本会消失。那就是那个。

基本上,您需要从自定义malloc拨打::operator new。不仅如此,还要按照18.4.1.1/4中的说明正确处理错误:

  

默认行为:

     

- 执行循环:   在循环内,首先是函数   尝试分配请求的   存储。是否涉及尝试   调用标准C库   函数malloc未指定。

     

-   返回指向已分配的指针   如果尝试成功,则存储。   否则,如果是最后一个参数   set_new_handler()是一个空指针,   扔bad_alloc。

     

- 否则,   函数调用当前的new_handler   (18.4.2.2)。如果被调用的函数   返回,循环重复。

     

- 循环   尝试分配时终止   请求的存储成功或   当一个名为new_handler的函数   不回来。