C++语言提供了三种关于new、delete的操作或者概念,这三种分别体现了C++语言对内存进行操作的不同层次,深入理解这三种情形,对于不论是个人开发中对内存进行管理或者是阅读其他代码都是一个基础。特在此进行总结。
凡是涉及到对内存进行操作的时候,如果新开始配置,那么对其进行细化都可以分为三个步骤:
1. 分配一段原始内存,其上可以存储任意类型的数据对象(也就是可以理解为对应的指针类型是void * );
2. 构造一个指定类型的对象,不论是语言原生支持的类型还是用户自定义类型,都会调用构造函数进行该对象的构造;
3. 将构造的对象存储到分配的原始内存上,让指向改内存的指针类型从void * 变为相应对象类型的指针类型。
同理,如果是使用完成进行释放内存,那么细化的步骤与上述相反:
1调用对象的析构函数销毁这个对象;
2将堆上使用的内存释放归还给操作系统。
new/delete operator
new、delete运算符,从字面上看,这是一种语言提供的特殊运算符,与“+、-、*、/”这种算术运算符属于同一个范畴,也就是C++语言规范提供的,开发者是不能进行改动的,只能被动的使用。
功能
new operator实现上述提到的所有三个步骤:从堆上扫描可使用的内存进行分配,调用相应类型的构造函数构造一个对象,最后将对象存储到相应的堆内存上。delete operator同样实现了上述所有细化的步骤。
限制
- new和delete操作符是语言支持的通用内存操作符,无法进行重载也就无法修改其行为,因此,如果希望对内存管理的细化的步骤进行操作,就无法实现。
- 语言支持的通用行为效率较低,对于频繁内存申请与释放的程序不适用。
operator new/delete
operator new/delete中的operator与new/delete就是C++语言提供的运算符重载语法,与“operator ++,operator ==”这种运算符重载是同一个范畴,二者合在一起作为运算符重载的函数名称。
功能
以自定义类的一个运算符重载成员函数出现,实现自定义额外功能后,一般通过调用全局的operator new函数,来为所属类的对象分配指定大小的内存,因为是类的一个成员函数,因此不会调用类的构造函数。
进行内存分配时,如果无法满足要求会有如下行为:
(1)如果有new_handler就调用之,否则
(2)如果没有要求不抛出异常(没有使用nothrow表达式),就执行bad_alloc异常,否则
(3)返回0
特性
如果需要对某一个自定义的类的内存分配做出个性化的设置,就可以利用这个operator new/delete运算符重载函数来重写,需要注意的是:
(1)operator new重载函数的返回值必须声明为void *,ope