C++的内存分布
我们之前应该讲过C语言的内存分布,一些基础的东西,其实这里也只要掌握一些基础的东西就足够了,我们看一张图片,
这一张图很清晰的表述了我们的简单内存管理,我们的静态数据是放在数据段的,申请的空间是在堆上的。这些是一些基础的东西,那么我们就由则这些基础的知识来做一道题目。
大家认真看一看,是不是变量在栈,指针也在栈,常量在代码段,开辟的空间在堆上。这句话就是上面的题目想要表达的意思。
C++的内存管理方式
大家都知道C的内存分配是malloc/realloc/calloc/free来分配空间的,这些在C++里面依然适用,但是C++自己又设计了一套,我们看看。
new/delete操作内置类型
new是开辟空间的,delete是释放空间的,其实和C语言里面有点像,也是开辟空间和释放空间。但是C++的这种好用些,方便些。我们用一段代码看看到底怎么用。
注意:申请和释放单个元素的空间,使用new和delete操作符,申请和释放连续的空间,使用new[]和delete[],注意:匹配起来使用
new和delete操作自定义类型
我们看一段代码。
这就是C和C++的区别。C++的new和delete会调用构造函数和析构函数,但是malloc不行。这就是区别,当然内置类型也是一样的。
operator new与operator delete函数
new和delete是用户进行动态内存申请和释放的操作符,operator new 和operator delete是系统提供的全局函数,new在底层调用operator new全局函数来申请空间,delete在底层通过operator delete全局函数来释放空间。
其实,operator new就是通过malloc来实现的,operator delete就是通过free来实现的。
new和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次构造函数
new[ ]delete的原理:
1. 在释放的对象空间上执行N次析构函数,完成N个对象中资源的清理
2. 调用operator delete[]释放空间,实际在operator delete[]中调用operator 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在释放空间前会调用析构函数完成空间中资源的清理释放。