目录
三:operator new和operator delete函数
2.new 和delete对内置类型和自定义类型处理的底层原理
接下来的日子会顺顺利利,万事胜意,生活明朗-----------林辞忧
前言:
在C/C++中,对于要开辟和释放动态的内存空间,在C语言中常常使用malloc,calloc,realloc,free四大函数来完成,而在C++中就会使用new和delete来完成动态内存空间的申请释放,而C++兼容C语言所以也可以使用四大函数,但注意free和delete不能混着用,尽量匹配使用的
一:C语言中区域划分的回顾及各个变量存在的位置
1.经典例题
2.C/C++中内存区域的划分
二:C++内存管理方式 new delete操作符
1.对于内置类型
我们可以发现对于malloc和new申请的空间都不会完成初始化,所以对于内置类型new和malloc差不多,那么在C中要想完成初始化的话,就得使用calloc函数,C++中也可以完成初始化
开辟多个并初始化
2.对于自定义类型
三:operator new和operator delete函数
1.new和delete的底层实现原理
1.new和delete是用户用来动态内存申请和释放的操作符,operator new和operator delete是系统提供的全局函数,而new在底层是调用operator new全局函数来实现动态申请空间的,delete在底层是调用operator delete 全局函数来实现动态内存空间的释放的
2.operator new全局函数:该函数实际是通过malloc来申请空间的,当malloc申请空间成功时直接返回;申请失败时抛异常
3.operator delete全局函数是通过free来释放空间的
2.new 和delete对内置类型和自定义类型处理的底层原理
1.对于内置类型
malloc free和 new delete基本相同,不同的是 new delete申请和释放的是单个元素的空间,new[],delete[]申请的是一块连续的空间,new失败时抛异常,而malloc失败时返回NULL
2.对于自定义类型
1.new的原理
1.调用operator new函数申请空间
2.在申请空间时自动调用构造函数
2.delete的原理
1.调用operator delete函数释放对象的空间
2.在空间上执行析构函数,完成对象中资源的清理工作
3.new[N]的原理
1.调用operator new[]函数,在operator new[]函数中调用N次operator new函数完成N个对象空间的申请
2.在申请的空间上执行N次构造函数
4.delete[]的原理
1.在释放的对象上调用执行N次析构函数,完成N个对象中的资源清理工作
2..调用operator delete[]函数,在operator delete[]函数中调用N次operator delete函数完成N个对象空间的释放
四:定位new表达式(placement-new)
1.概念
定位new表达式是在已分配的原始内存空间中调用构造函数初始化一个对象
定位new表达式在实际中一般是配合内存池使用的,内存池的内存是由操作系统的对上申请的,内存池分配的内存没有初始化 ,如果是自定义类型就可以使用定位new表达式调用构造函数初始化
五: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在释放空间前会调用析构函数完成空间中资源的清理