引言
我们在学习C++的时候,会经常在堆上申请空间,所以这个时候就体现了内存管理遍历。
图下是我们常见的计算机的内存划分:
我也在图下对部分变量存在的位置,及时标注。(如果有任何问题可以联系博主修改,感谢大家。)
那么看完这个内存分布图,我想给大家看到题:如果遮住答案,大家能答对吗?
这些题是我们在C语言中常见的存储方式。在图中我们可以看到我们使用了malloc()/free()在堆上进行开空间,所以内存管理中最重要的区域就是堆了。
new/delete
new/delete的使用方法
在C语言的时候,我们用malloc()/free()对堆上的空间进行开辟和释放,但是在C++我们使用new/和delete来进行堆的空间开辟和释放。
可能有些小伙伴会很奇怪为什么new会返回一个指针,new的底层还是malloc,所以返回的还是指针。那我们为什么直接用malloc,还会创造一个new呢?大家可以从下图看出new其实很方便使用,不需要判断(后期会说到抛异常),还不需要计算开辟空间大小。
new的初始化
如图,p3是我们开辟了一个int空间初始化成了10,p4开辟了10个空间初始化12345。
new/delete的特点
注::在申请自定义类型的空间时,new会调用构造函数,delete会调用析构函数,而malloc与free不会。
operator new与operator delete函数
new和delete是用户进行动态内存申请和释放的操作符,operator new 和operator delete是系统提供的全局函数,new在底层调用operator new全局函数来申请空间,delete在底层通过operator delete全局函数来释放空间。(如下图)
operator new[]会多开空间情况
为什么operator new[]会多开空间呢?那是因为当我们定义的时候,编译器知道我们要开多大的空间,但是当我们析构空间的时候,编译器并不知道我们要析构多少,所以多开的空间是为了存放记录个数。
初阶模板
函数模板
编译器会根据函数模板生成不同类型的函数。那如果我同时存在当前函数和函数模板,编译器会怎样选择?
有现成合适的函数,编译器会优先去调用合适的,没有合适的去调用函数模板生成匹配的。
模板实例化是提前规定好了函数模板的类型,。
类模板
从下图可以看出,类模板和typedef有一点像,但是typedef其实是没有类模板好用的。
原因:
我们曾经写过栈的实现,那么如果我现在有一个项目需要两个不同类型的栈被创建出来,typedef就不能够满足我们的需求了,这个时候类模板会比typedef好用很多。