sha*_*oth 29 c++ memory memory-management operator-overloading
假设我需要重载全局::operator new()
以便为每个分配的对象存储额外的数据.所以基本上它会这样工作:
::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函数未返回时,循环终止.