用new运算符实现动态内存分配
1.第一种用法:给一个变量分配内存空间**
P = new T;
T是任意数据类型的名字,P是类型为T*的指针
动态分配出一片大小为sizeof(T)字节的内存空间,并且将该内存空间起始地址赋值给P,例如:
int *pn;
pn = new int; //分配一个int大小的内存,起始地址赋值给pn
*pn = 5; //通过指针间接访问上述内存地址并赋值
2.第二种用法:给一个数组分配内存空间
P = new T[N];
T:任意数据类型名
P:类型为T*的指针
N:要分配的数组的元素个数,可以是整型表达式
动态分配出一片大小为N * sizeof(T)字节的内存空间,并将该内存空间的起始地址赋值给P。例如:
int *pn;
int i = 5;
pn = new int[i*20]; //i* 20 = 100;所以数组下标为0-99
pn[0] = 20;
pn[100] = 30;//编译并没有问题,访问时数组越界
new运算符的返回值类型
new T;
new T[n];
这两个表达式的返回值的类型都是 T*
验证:
int *p = new int; //赋值运算符两边的数据类型必须相同,
//所以侧面验证该返回值的数据类型是 T*
用delete运算符释放动态分配的内存空间
用new分配的内存空间一定要用delete运算符进行释放
delete 指针 ; //该指针必须指向new出来的空间
例如:(变量)
int *p = new int;
*p = 5;
delete p; //释放内存空间
delete p; //导致异常,一片空间不能被释放两次
例如:(数组)
int *p = new int[20];
p[0] = 1;
delete []p; //注意指针前要加[]
若动态分配的存储空间没有被回收就会变成内存垃圾,在之后的程序运行中,该片内存将不会被使用,就被浪费掉了
————参考北大c++网课