假设我需要重载全局::operator new()
for storing extra data with each allocated object。所以基本上它会以这种方式工作:
::operator new()
的每次调用,它将传递对象大小并添加额外数据的大小 ::operator delete()
将反向移动指针,访问额外数据,释放内存。
现在的问题是如何分配内存?当然我可以调用malloc()
或某些特定于平台的函数(通常是这样做的)。但通常当我需要在C ++中分配原始内存时,我会调用::operator new()
。我可以调用原始::operator new()
从我重载的全局::operator new()
内部进行内存分配吗?
答案 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的函数 不回来。