C++——指针与内存分配

指针与内存分配

Thanks for
注意栈空间与堆空间都是有限的,因而可能出现空间过大的状态,将大的数组放在全局数据。
C++——指针与内存分配_第1张图片
C++——指针与内存分配_第2张图片
1.静态数据区
在这里插入图片描述
内存连续分配,数据的地址与分配顺序有关
 
2.栈空间
栈是一种先进后出的数据结构
函数内定义的局部变量函数参数都在栈空间分配.
栈空间中内存连续分配, 数据的地址顺序与数据分配的先后顺序相反.
每个线程(程序)的栈空间独立且大小有限,栈空间分配完之后会发生栈溢出错误.所以:
不能在函数内部定义大型数组
不能调用嵌套层次过多的递归函数
 
3.堆空间
内存分配不一定连续
 
关于new与delete
1.new与delete都不是函数
 
2.申请一个单变量空间

class A *pA = new A(10);  //可以看出new不仅为此指针分配了空间还将此空间初始化
delete pA;

通过此例子我们可以看出new与delete不仅可以分配空间还可以有构造与析构函数

3.申请一个数组空间

string *psa = new string[10];      //array of 10 empty strings
int *pia = new int[10];           //array of 10 uninitialized ints

delete [] psa;
delete [] pia;

这里的new[ ] 多分配了一个空间给这个序列存储大小供delete删除

没有默认构造函数的情况下:

#include 
class A {

public:
	int a;
	explicit A(int b) :a(b) {}
};
int main() {
	auto a = new A[3]{ A(1),A(2),A(3) };
	std::cout << a[2].a;
}

或者

class A{
    int a;
public:
    A(int b):a(b){}
};
int main(){
    auto a=new A[3]{1,2,3};

}

4.二维数组的分配与释放

分配空间:

int **array;  //首先声明一个二维数组指针
array=new int*[10];  //接下来分配一个一维指针数组
for(int i=0;i<10;i++) //对每个元素进行分配空间
         array[i]=new int [5];

释放空间:

 for(i = 0; i < m; i++)
		delete[] p[i];
	delete[] p;

你可能感兴趣的:(C++,c++)