首先,要了解该如何使用C++来进行内存的管理,我们需要了解C++中内存区域的划分
C++内存区域的划分:
C++中的内存主要分为四个区域,分别是栈区、堆区、数据段以及代码段。
栈区:用来存储局部变量,函数的参数和返回值等,栈区的内存很小,通常只有几MB,在程序运行过程中自动分配与释放空间
堆区:用于动态内存分配,malloc等内存申请函数申请的就是堆区的内存,堆区是一个大容器,具有较大空间,在32位环境下最多可有2G空间,而在64位环境下可以认为是拥有无限内存可供分配。堆区的空间需由程序员手动分配与释放,若程序员没有释放申请的空间,在程序结束后由操作系统自动释放。
数据段:也被称为静态区,用于存储全局变量和静态变量。数据段有可分为date(主要用来存放已经初始化的数据)区和bss区(主要用来存放未经初始化的数据)
代码段:又被称为常量区,用于存储程序员写的被转化为二进制的CPU可执行的代码和一些如用const修饰的常量数据。代码段存储的数据具有只读属性,不能随意更改。
管理内存的方式
C语言中动态管理内存的方式是通过malloc、calloc、realloc和free来完成,而C++中则是使用new和delete进行内存的管理,两者的区别在于:malloc、calloc属于函数的范畴,而new和delete则是属于关键字的范畴,下面是一段示例代码
new和delete相对于malloc和free的优点
那么,为什么有了malloc和free等函数后,C++还要搞出个new和delete呢,关键就在于,对于自定义类型,在使用new申请空间后,编译器会自动调用该类型的构造函数,对申请的空间进行初始化,同样,对于自定义类型,在使用delete释放空间时,编译器会首先调用自定义类型的析构函数,再对空间进行释放。
operator new 和operator delete
operator new 申请空间的用法和malloc其实是一模一样的,二者的区别在于:malloc在申请空间失败后,会return 0,而哦、operator new在开辟内存失败后则会抛异常。而operator new和free二者则完全相同,在释放空间失败后,都会导致程序终止。
new的原理:1、调用operator new 函数来申请一段空间 2、调用构造函数,对申请的空间进行初始化;
delete的原理:1、调用析构函数 2、调用operator delete函数对申请的空间进行释放;