3. new 的三种形态 new operator 常用的 new,语言函数内建,不能重载。调用过程中实际完成的有三件事:
为类型对象分配内存;
调用构造函数初始化内存对象;
返回对象指针
如果是在堆上建立对象,直接使用 new operator。 operator new 普通操作符,可以重载。如果仅仅是分配内存,那么应该调用 operator new,但不负责初始化。系统默认提供的分配器在时间和空间两方面都存在一些问题:分配器速度较慢,分配小型对象时空间浪费严重,重载 new/delete 有三方面好处:
改善效率
检测代码中的内存错误
获得内存使用的统计数据
C++标准规定,重载的 operatornew 必须是类成员函数或全局函数,全局的 operator new 重载不应该改变原有签名,而是直接无缝替换原有版本。全局重载很有侵略性,别人使用你的库无法使用默认的 new,而具体类的重载只会影响本 class 和其派生类,但是类的 operator new 函数重载必须声明为 static,因为 operator new 是在类的具体对象被构建出来之前调用的。
为了获得 2 和 3 的优势,重载的 operator new 需要如下函数声明
void* operator new(size_t, const char* file, int line); placement new 定义在库<>中。如果想在一块已经获得内存里建立对象,那么应该调用 placement new。通常情况不建议使用,但在某些对时间要求非常高的应用中可以考虑,因为选择合适的构造函数完成对象初始化是一个时间相对较长的过程。
点击关注,第一时间了解华为云新鲜技术~