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

内存分区

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

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

堆:动态申请的数据

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

常量区/代码段:字符串

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值