new 和delete

本文详细介绍了C++中new和delete操作的执行过程,new主要涉及malloc、指针转换和构造函数调用,而delete则包括析构函数调用和free。强调了delete时先析构后free的重要性,以防止内存泄漏。同时提到new分配的对象存储在堆区,必须使用delete释放。此外,简要提到了malloc与free在内存管理中的额外职责,如debug信息和cookie的存储。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

new的功能可以被拆解为三步:

一是通过调用malloc分配无类型空间(大小为类的大小)

二是进行指针类型转换

三是调用类的构造函数(赋初值之类的操作)

delete的功能可以被拆解为两步:

一是调用析构函数

二是调用free

delete这里的执行顺序是先析构在free,顺序很重要,否则很有可能会造成内存泄漏:

比如:

x=new string;

delete x;

如果先调用free,那么直接释放的是x这个指针的所占用的空间,那么x所指向的内容就不能被释放

,就会造成内存泄漏。如果先调用析构函数,那么就能够先释放掉所指向的内容,再释放指针的空间。

注:new分配的空间和创建的对象都在堆区,必须用delete去释放。

static 类名 对象名;程序结束才会释放。

关于free和malloc:

实际上malloc分配内存的时候,不只是分配对象所需要的内存,还会多分配关于debug信息的内存,cookie的信息(用来记录分配从哪里开始和从哪里结束),在vc下,由于要求一次分配的内存要是16的倍数,所以还会有一些padding存在。cookie的值是记录着分配的内存块的大小,然后借最后一位来表示这个内存块是分配出去了,还是回收回来,1表示分配,0表示回收。比如图中的cookie为000000041,表示此内存块是被分配出去了的,大小是0000000040。

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值