六、内存分配
在C语言中使用的是一套内存分配库函数malloc、calloc、realloc、free
来进行内存分配和回收,在C++中仍然可以这样做,但是C++还有更好的方法——new
运算符。
(1)C++的内存分区模型
C++程序在执行的时候,将内存大致分为4个区域
- 代码区:存放函数体的二进制代码,由操作系统进行管理;
- 全局区:存放全局变量和静态变量以及常量,常量包括
const
修饰的全局常量和字符串常量;- 栈区:由编译器自动分配释放,存放函数的参数值,局部变量等;
- 堆区:由程序员分配和释放,若程序员不释放,则程序结束时由操作系统来释放。
注意事项:
1、栈区存放局部变量——函数不要返回局部变量的指针或者引用。
2、堆区主要用C++的new关键字来开辟空间和释放空间。
(2)使用new
进行内存分配
使用C++的内存分配运算符new
,程序员需要告诉程序new
,需要为哪种数据类型分配内存,new
将找到一个长度正确的内存块,然后会返回该内存块的地址。例如:
typeName *pointer_name = new typeName; //通用写法
typeName *pointer_name = new typeName(init_value); //开辟一块空间并且初始化为init_value
int *pt = new int; //为pt指针分配了一个int大小的内存空间
double *pd = new double(5.0); //为pd指针分配了一个double大小的空间并且初始化为5.0
当没有足够的内存空间来进行分配的时候,new
会返回一个空指针,我们可以判断new
是否返回空指针来判断内存分配是否成功。
使用new
创建动态数组:只要将数组的元素类型和元素数目告诉new
,必须在类型名后面加上方括号[]
,其中包含元素数目。
typeName *pointer_name = new typeName [ArrySize]; //通用写法
当程序使用完new
分配的内存块时,应该使用delete
来释放它们,对于使用new
创建的数组,应该使用另一种格式的delete
来释放,delete
后面必须加上方括号[]
。
delete [] pointer_name; //通用写法
举个示例:
int *pt = new int[20]; //分配空间
delete [] pt; //释放空间
(3)使用delete
释放内存
C++的内存释放运算符delete
,delete
的作用是释放已经使用new
进行内存分配的空间(不要尝试释放已经释放的内存块,这样做的结果是未定义的)。但是对空指针NULL
使用delete
是安全的,例如:
int *ps = new int;
int *pt = NULL;
delete ps; //释放ps指向的内存空间
delete pt; //释放空指针是安全的