动态内存管理

c语言中我们学过的申请动态是malloc,释放动态内存为free
但时c++,我们有增加了new和delect
new和delect,new[]和delect[]

首先我要说的是new,delect都是关键字在c++中, 然后这些内存管理都要匹配使用,不能混着乱用

那么malloc/free和new/delect的区别和联系是啥?

a.她们都是内存管理的入口
b.malloc/free是c/c++标准课里的函数,new/delect是c++里的关键字
c .然后 我们可以打开new的底层实现代码,我们可以发现,如果在new一个类的时候我们首先分配空间,然后在调用了这个类的构造函数对她进行初始化
然后我们再来看delect,先是调用了析构函数来,释放类里的堆上的空间,然后在释放栈上的空间
d.malloc需手动计算类型的大小并且函数返回值为void*,而new自己计算返回值的大小并且会返回相对应的类型的指针



然后我们可以来operator new,operator delect,operator new[],operator delect[]
首先乍一看,会觉得是操作符的重载,但是我们说过new和delect都是关键字怎么会有操作符的重载呢,所以这个肯定不是,那这个是什么呢?
首先确定的说这些都是函数,那么这些函数是干嘛的呢,分配空间和释放空间
operator new调用了malloc来开辟空间,所以他是malloc的一层封装
operator delect调用了free来释放空间,他是free的一层封装

总的来说:
new:
1.调用operator new来开辟空间
2.调用构造函数来初始化

delect:
1.调用一次析构函数来释放堆上的空间
2.调用operator delect释放栈上的空间


new[]:
1.调用operator new[]来开辟空间
2.调用n次构造函数来进行初始化


delect[]:
1.调用n次析构函数来进行堆上的销毁(思考为什么会调用n此析构函数)
2.调用operator delect[]来进行栈上的内存销毁

那为什么说他们不能混用呢?
首先我们要明白,delect/new和malloc/free的做的事情是不一样的,在用的时候一定要匹配使用,否则会发生程序崩溃和内存泄漏问题
我们还是要从调用几次析构函数来说,我们在调用delect的时候是不会将次数传进去的,那么是怎么进行析构的话呢?

我们其实会发现在调用malloc数组的时候,我们会发现若开辟10个int类型的数组的时候,我么会发现开辟new出来的字节不是40个字节而是44个字节,并且new之后返回来的指针是ptr的指针,那么那之前的4个字节是干嘛的呢,其实是将n存在这4个字节中,在调用析构函数的时候就将这这个数组拿出来使用

那么我们首先用new[]在开辟类的空间的时候会对多开辟4个字节的空间,将对象得个数存起来,在进行析构函数的时候使用,首先指针会向前移4个字节进行解引用,然后在进行delect[]的时候使用这个解引用出来的东西,但是这个是针对自定义类型比如类,因为只有类会调用构造函数,如果不是类的话是不会多开辟4个字节的



猜你喜欢

转载自blog.csdn.net/qq_36767247/article/details/80307022