目录
2.operator new与operator delete函数
2.1operator new-operator delete
1.new-delete
C
语言内存管理方式在
C++
中可以继续使用,但
C++又提出了自己的内存管理方式:通过
new
和
delete操作符进行动态内存管理。
1.1.操作内置类型
补充:申请和释放单个元素的空间,使用
new
和
delete
操作符,申请和释放连续的空间,使用
new[]
和delete[],对于内置类型而言,用malloc和new,除了用法不同,没有什么区别。
2.2.操作自定义类型
补充:在申请自定义类型的空间时,new会调用构造函数,delete会调用析构函数,而malloc与free不会。
2.operator new与operator delete函数
介绍:
new
和
delete
是用户进行
动态内存申请和释放的操作符
,
operator new
和
operator delete
是系统提供的
全局函数
,
new
在底层调用
operator new
全局函数来申请空间,
delete
在底层通
operator delete
全局函数来释放空间。
2.1operator new-operator delete
malloc 申请空间失败是返回空指针,而new申请空间是抛出异常。
1.operator new:该函数实际通过malloc来申请空间,当malloc申请空间成功时直接返回;申请空间失败时抛出异常。
2.operator delete: 该函数最终是通过free来释放空间的
new Date:底层会去调用operator new 函数,再去调用这个类的构造函数。
delete p :在空间上执行析构函数,完成对象中资源的清理工作,再调用operator delete函数释放对象的空间
2.2new和delete的实现原理
如果申请的是内置类型的空间,
new
和
malloc
,
delete
和
free
基本类似,不同的地方是:
new/delete
申请和释放的是单个元素的空间,new[]
和
delete[]
申请的是连续空间,而且
new
在申请空间失败时会抛异常,malloc会返回
NULL
。
对于自定义类型:
new的原理:
1. 调用operator new函数申请空间
2. 在申请的空间上执行构造函数,完成对象的构造
delete
的原理:
1.
在空间上执行析构函数,完成对象中资源的清理工作
2.
调用
operator delete
函数释放对象的空间
new T[N]
的原理:
1.
调用
operator new[]
函数,在
operator new[]
中实际调用
operator new
函数完成
N
个对象空间的申请
2.
在申请的空间上执行
N
次构造函数
delete[]
的原理:
1.
在释放的对象空间上执行
N
次析构函数,完成
N
个对象中资源的清理
2.
调用
operator delete[]
释放空间,实际在
operator delete[]
中调用
operator delete
来释放空间
3.malloc/free和new/delete的区别
malloc/free和new/delete的共同点是:都是从堆上申请空间,并且需要用户手动释放
不同点:
1. malloc
和
free
是函数,
new
和
delete
是操作符
2. malloc
申请的空间不会初始化,
new
可以初始化
3. malloc
申请空间时,需要手动计算空间大小并传递,
new
只需在其后跟上空间的类型即可
4. malloc
的返回值为
void*,
在使用时必须强转,
new
不需要,因为
new
后跟的是空间的类型
5. malloc
申请空间失败时,返回的是
NULL
,因此使用时必须判空,
new
不需要,但是
new
需要捕 获异常
6.
申请自定义类型对象时,
malloc/free
只会开辟空间,不会调用构造函数与析构函数,而
new
在申 请空间后会调用构造函数完成对象的初始化,delete
在释放空间前会调用析构函数完成空间中资 源的清理