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

sha*_*oth 29 c++ memory memory-management operator-overloading

假设我需要重载全局::operator new() 以便为每个分配的对象存储额外的数据.所以基本上它会这样工作:

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

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

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

Pot*_*ter 20

您无法访问它们,因为它并没有真正超载,而是它的替代品.当你定义自己的时候::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函数未返回时,循环终止.