C++重载operator new/delete

来源:百度知道 编辑:UC知道 时间:2024/07/04 20:30:36
现在想对一个工程做一下内存管理,让我能够知道所有采用new/delete分配内存的地址和大小。我的思路是对new/delete进行重载,在完成基本new/delete功能的基础上,还能再加一些日志。现在的问题是,若在每个类内重载这两个操作符,可以完成这样的功能,但是由于有很多个类,所以需要对很多个类都重载操作符。若对全局new/delete进行重载,怎么让它们在完成本身功能的基础上还能附加完成我的操作。我若采用如下形式
void *operator new(std::size_t size)
{
// do my work here
return operator new(size);
}
这样的全局new重载其实就循环调用了。
而如果在重载的全局new中使用malloc,则不能调用类的构造函数。各位有什么好的方法吗?欢迎讨论。

C++既然允许多继承,那就写一个重载了new/delete的公共基类,让所有的类在保持原继承关系不变的情况下全部继承该类即可。当然了,出于对多继承本能的反感,这个基类写成一个接口似乎更合适,在保证相对清晰继承关系的前提下全部实现该接口即可,麻烦是肯定的但是安全清晰。

重载全局操作符肯定不是什么安全的选择,另外楼主的这一方案对placement new似乎没有作用。

LZ这句话:“而如果在重载的全局new中使用malloc,则不能调用类的构造函数” 说得不对。重载的new/delete操作符是只管内存的分配/释放就够了的,调用构造函数是用NEW分配了空间之后由编译器替你做的事。换句话说重载的new运算符函数所做的事并不是new语句所做的事的全部。你只管在new运算符函数里写内存怎么分配就行