内存分区
内存可分为栈,堆,静态区/数据段,常量区/代码段
栈:函数栈帧,临时变量,开辟空间
堆:动态申请的数据
静态区/数码段:静态数据,全局变量
常量区/代码段:字符串
new和delete开辟空间
C的malloc,realloc,free申请内存空间
C++用new/delete操作符开辟空间
int*p1=(int*)malloc(sizeof(int));
free(p1);
int*p2=new int;
delete p2;
int*p3=(int*)malloc(sizeof(int)*10);
free(p3);
//开辟10个空间
int*p4 = new int[10];
delete[] p4;
C++初始化
int* p5=new int(0)
//数组初始化,剩下的是0
int*p6=new int[10]{1,2,3,0,0,0};
对于内置类型无区别,对于自定义类型,new会调用构造函数,delete析构函数,malloc只能自动开辟空间,new可以看成为适应类而产生的。
A*p6 =new A[10];
delete[] p6
构造函数构造10次,析构函数调用10次。
自定义类型初始化
A*p6 =new A[10]{1,2,3,4};
A*p6 =new A[10]{A(1),A(2),A(3),A(4)};
A*p7 = new A[10]{A(1,2),A(3,4)};
new和malloc的关系
new的功能分为两部分,调用构造函数和开辟空间。operate new 函数负责开辟空间,底层上用malloc开辟。
operate new 对malloc进行封装,且函数包含了检测空指针,如果开辟失败不返回空指针,打印异常。delete同理
*new 先开辟空间再调用构造,delete先调用析构,再释放空间。
new可以显式调用函数
//开辟空间
A* p1=(A*)malloc(sizeof(A));
//new显式调用构造函数
new(p1)A(1);
//调用析构函数
p1->~A();
free(p1);
显式调用的作用:池化技术,提前申请一块内存当成内存池,谁需要给谁,不用每次都去找堆里申请。提前申请的内存没有调用初始化,用new显示调用,来提高效率。