针对c++初学者 new用法解读
动态内存分配技术是在程序运行时,按照需求随时在堆上动态
分配一块内存空间供程序使用,在使用完毕后再由程序释放,
其中,被动态申请和释放的称为堆对象。
内存动态申请
new运算
语法格式:new 数据类型(初值列表):
new运算的作用就是程序运行到该运算时,申请一块用于存储相应数据类型的内存空间,如果申请成功的话,就会对用初值列表的值,对这块内存空间进行初始化,并返回这块内存的首地址,因此new运算必须将其返回值赋给一个指针,才可以保证后续使用和内存释放,如果内存申请失败,编译器会抛出异常,或返回一个空指针。
内存动态释放
delete运算
语法格式:delete 指针变量名;
当用new运算申请的内存使用完毕后,使用delete运算符进行内存的
动态释放
例子:
#include<iostream>
using namespace std;
int main()
{
double* p = new double(5.33);
// 内存申请一块用于存放一个double类型的内存空间
// 将5.33赋给这块空间
// 将给空间的首地址用来初始化指针变量p
// *p=5.33
int* p1 = new int(10);
int* p2 = new int(20);
delete p;
delete p1 ,p2; //delete 运算符后可释放多个指针
return 0;
}
动态分配的内存是由于是用户自己申请的,系统不知道它何时使用完毕,
也就不存在生存期的概念,系统不会自行释放这些内存,必须由用户
自行释放,因此每一次new运算就必须相应使用一次delete运算,否则
系统有什么内存活动都要避开这块内存,造成内存泄漏。
动态数组
因为通常动态分配一个变量意义不大,这里有动态数组的创建。
语法格式: new 数据类型 [数组长度];
数组长度的基本要求和非动态创建基本一样,但这里允许变量的出现。
delete 语法格式 :delete 指针变量名;
注意delete前的[] 不可以省略。
例:
#include<iostream>
using namespace std;
int main()
{
int c=5;
float* p = new float[c * 4];
//结果是动态创建一个长度为20的一维数组
delete[]p;
return 0;
}