cpp中operator new或者placement new是内存管理的中间层,直接关系到allocator和new的具体实现,因此,实现operator new或者placement new的重载是实现内存接管的方法。
对于operator new的重载,包含全局重载和在类中进行重载,其中全局重载的影响是全局的,一般不推荐,主要使用第二种类内重载。
全局重载
1 | void* myAlloc(size_t size){ |
类内重载
1 | class Foo{ |
按道理上述的重载函数需要是static,因为operator new的对象还没创建完成,没办法通过对象来进行函数调用,因此需要是static来实现通过类调用函数。不过cpp考虑到了这个问题,没有把上述写法当作一种错误。
1 | // 如果要调用自己的内存管理工具 |
placement new的各种重载
1 | class Foo { |
上述的placement delete一般不会被调用,只有当我们的placement new出现异常时才会调用我们自己的placement delete,这实际上类似一种异常处理的handler。因此,也不需要全部 写好对应的placement delete,没写的代表放弃了异常处理。