C++内存管理

上一篇文章提到delete可以回收数组内存,这是为什么呢,这就需要理解一下delete底层是调用free,而free是怎么回收数组的呢?

由于free和malloc配对使用,malloc的时候大小已经告诉系统了。
free的时候,系统会比对一下这个地址,是不是malloc申请的,如果不是,不给释放
如果是的话,系统就知道要释放多大内存,因为malloc的时候,系统有记录的。
当然了,申请的地址,也记录了的,否则,就无法比对了。
#include <stdio.h>
#include <stdlib.h>

int main()
{
	int *p;
	p=(int *)malloc(sizeof(int)*3);
	p[0]=1;p[1]=2;p[2]=3;
	p++;
	//free(p);/由于p++过,已经不是malloc申请的那个地址了,因此这句运行会报错
	p[0]=4;
	free(p-1);//这句倒是正确的,因为经过p++,这里的p-1刚好是malloc申请的地址
	return 0;
}
另外,问你一个同样的问题:
char *p1 = new char[10];
char *p2 = new char[20];
delete p1[];
delete p2[];
释放p1和p2的时候,没有指明大小,它怎么知道p1是10,p2是20的呢?
如果不知道,它怎么去争取的释放它们呢?

在这里插入图片描述
在这里插入图片描述
注释Myclass析构函数后将不在报错
在这里插入图片描述
根据侯捷老师说的,强行用delete中有图多出的4个字节(右边中间白色的内存)将内存管理的布局打乱,导致报错,如果你没有写析构函数,编译器就不会多出这4个字节,这部分分配出来的空间可以直接被delete也就是free回收。
那就还有几个疑问,new[]和delete[]的源码多做了什么动作呢,可以知道的是delete[]通过多出的字节,调用了3次析构函数,delete对于简单的数据是调用一次析构函数还是根本没有调用析构函数呢? ,(感觉这样问不是很严谨,人家没有析构函数叫调用啥,调用的应该是内置的)

补上流程图

在这里插入图片描述
在这里插入图片描述

free和malloc做了什么?

他们真的很慢吗?
在这里插入图片描述
未完待续
想继续归纳心有余而力不足了,待我自己写出内存池的时候可能会对内存管理理解更深。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值