C++:内存管理

一.数据在内存中的存储

1.代码段(常量区): 存放字符串常量("abc"),const全局变量,机器指令(代码),函数编译后的二进制指令

2.数据段(静态区): 存放全局变量,static静态变量(包括函数内static,函数外static),初始化的全局/静态变量,未初始化的全局/静态变量

3.栈: 存放函数内局部变量,函数形参,函数返回地址,临时变量

4.堆: 存放手动申请的动态内存

练习1:

解析 : globalVar是全局变量,存放在静态区。staticGlobalVar是静态全局变量,存放在静态区。staticVar是函数内static静态局部变量,存在静态区。locaVar是普通局部变量,放在栈上。num1是局部数组,本质为局部变量,放在栈。char2是字符数组,也是局部变量,放在栈。*char2等价于char20,就是栈数组里的第一个字符。pchar3是指针变量(局部变量),放在栈。abcd是字符串常量,放在代码段,*pchar3就是访问这个常量的首个字符。ptr1是局部指针变量,放在栈。*ptr1访问的堆内存。

二.C++内存管理方式

1.new/delete操作内置类型

注意事项:如果是动态申请多个空间,释放空间时必须搭配delete 使用,否则编译器会报错

2.new/delete操作自定义类型

new/delete和free/malloc的区别:

malloc和free是函数,new和delete是操作符

malloc申请的空间不会初始化,new可以初始化

malloc申请空间时,需要手动计算空间大小,new只需在后面跟上空间的类型即可,如果是多个对象, 中指定对象的个数即可

malloc的返回值为void*,在使用时必须强转,new不需要

malloc申请空间失败时,返回的是NULL,因此必须要判空,new不需要,但new需要捕获异常

申请自定义类型对象时,malloc/free只会开辟空间,不会调用构造/析构函数,new/delete会

使用场景:构建简单的链表

三。模板

1.定义:模板是代码复用工具,不用为每种类型单独写一个函数。模板不是代码,是编译器生成代码的蓝图。编译阶段,编译器根据你传入的类型,实例化出对应类型的代码。

2.使用方法:

(1)函数模板 -> template<typename T> 或 template<class T>

(2)类模板 -> template<typename T> 或 template<class T>

3.使用示例:

4.说明:如果有专门处理 int 的加法函数,则会优先调用这个专门处理加法的函数。如果没有此函数,才会调用函数模板

相关推荐
彦6 小时前
C和C++笔记
c语言·c++·笔记
徐小黑ACG6 小时前
Golang 基础01
开发语言·后端·golang
进击的大海贼6 小时前
基于C#开发的久坐提醒工具
开发语言·c#
vipxieliang6 小时前
ValidX 财务系统发票验证:发票号、税号、金额校验
java·spring boot
天空鸟_时光不老6 小时前
06-给AI流程加一道人工闸门
java·人工智能·spring boot·后端·spring·spring cloud·架构
平生幻6 小时前
unbuntu虚拟机确认python安装位置
开发语言·python
夜之眷属6 小时前
JVM实战:服务器堆外内存去哪了(NMT实测)
java·服务器·jvm·后端·性能优化
fundoit6 小时前
OIDC的UserInfo端点
java·架构·oauth2·oidc
运维行者_6 小时前
PHP性能监控怎么做?从响应时间到慢函数的6个关键指标
运维·服务器·开发语言·网络·支持向量机·php·接口隔离原则