C/C++的内存管理与初阶模板

本文探讨了C++中的内存管理,重点介绍了malloc(),free(),new,delete以及它们的区别,强调了new和delete在构造函数和析构函数的应用。同时讲解了operatornew和operatordelete的作用,以及函数模板和类模板在不同场景下的优势。
摘要由CSDN通过智能技术生成

引言

我们在学习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好用很多
在这里插入图片描述

  • 11
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 8
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值