波奇学C++:动态内存管理,new和delete

内存分区

波奇学C++:动态内存管理,new和delete_第1张图片

内存可分为栈,堆,静态区/数据段,常量区/代码段

栈:函数栈帧,临时变量,开辟空间

堆:动态申请的数据

静态区/数码段:静态数据,全局变量

常量区/代码段:字符串

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显示调用,来提高效率。

波奇学C++:动态内存管理,new和delete_第2张图片

你可能感兴趣的:(波奇学c,数据结构,c++)