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

引言

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

相关推荐

  1. C++:浅识内存管理

    2024-03-11 22:00:02       42 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-03-11 22:00:02       94 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-03-11 22:00:02       101 阅读
  3. 在Django里面运行非项目文件

    2024-03-11 22:00:02       82 阅读
  4. Python语言-面向对象

    2024-03-11 22:00:02       91 阅读

热门阅读

  1. C++复习 - String

    2024-03-11 22:00:02       40 阅读
  2. AcWing 5407. 管道(二分,区间合并)

    2024-03-11 22:00:02       35 阅读
  3. Linux C/C++编程笔记

    2024-03-11 22:00:02       55 阅读
  4. SpringBoot 线程池异步调用

    2024-03-11 22:00:02       43 阅读
  5. 排序的学习(一)

    2024-03-11 22:00:02       38 阅读
  6. zsh: command not found: mongo(mac版已解决)

    2024-03-11 22:00:02       38 阅读