在C语言中使用的是一套内存分配库函数malloc、calloc、realloc、free来进行内存分配和回收,在C++中仍然可以这样做,但是C++还有更好的方法——new运算符。
C++程序在执行的时候,将内存大致分为4个区域
- 代码区:存放函数体的二进制代码,由操作系统进行管理;
- 全局区:存放全局变量和静态变量以及常量,常量包括
const修饰的全局常量和字符串常量;- 栈区:由编译器自动分配释放,存放函数的参数值,局部变量等;
- 堆区:由程序员分配和释放,若程序员不释放,则程序结束时由操作系统来释放。
注意事项:
1、栈区存放局部变量——函数不要返回局部变量的指针或者引用。
2、堆区主要用C++的new关键字来开辟空间和释放空间。
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; //释放空间
delete释放内存 C++的内存释放运算符delete,delete的作用是释放已经使用new进行内存分配的空间(不要尝试释放已经释放的内存块,这样做的结果是未定义的)。但是对空指针NULL使用delete是安全的,例如:
int *ps = new int;
int *pt = NULL;
delete ps; //释放ps指向的内存空间
delete pt; //释放空指针是安全的