指针与内存分配
Thanks for
注意栈空间与堆空间都是有限的,因而可能出现空间过大的状态,将大的数组放在全局数据。
1.静态数据区
内存连续分配,数据的地址与分配顺序有关
2.栈空间
栈是一种先进后出的数据结构
函数内定义的局部变量及函数参数都在栈空间分配.
栈空间中内存连续分配,数据的地址顺序与数据分配的先后顺序相反.
每个线程(程序)的栈空间独立且大小有限,栈空间分配完之后会发生栈溢出错误.所以:
不能在函数内部定义大型数组
不能调用嵌套层次过多的递归函数
3.堆空间
内存分配不一定连续
关于new与delete
1.new与delete都不是函数
2.申请一个单变量空间
classA*pA=newA(10);//可以看出new不仅为此指针分配了空间还将此空间初始化delete pA;
通过此例子我们可以看出new与delete不仅可以分配空间还可以有构造与析构函数
3.申请一个数组空间
string*psa=new string[10];//array of 10 empty stringsint*pia=newint[10];//array of 10 uninitialized intsdelete[] psa;delete[] pia;
这里的new[ ] 多分配了一个空间给这个序列存储大小供delete删除
没有默认构造函数的情况下:
#include<iostream>classA{public:int a;explicitA(int b):a(b){}};intmain(){auto a=new A[3]{A(1),A(2),A(3)};
std::cout<< a[2].a;}
或者
classA{int a;public:A(int b):a(b){}};intmain(){auto a=new A[3]{1,2,3};}
4.二维数组的分配与释放
分配空间:
int**array;//首先声明一个二维数组指针
array=newint*[10];//接下来分配一个一维指针数组for(int i=0;i<10;i++)//对每个元素进行分配空间
array[i]=newint[5];
释放空间:
for(i=0; i< m; i++)delete[] p[i];delete[] p;