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 的加法函数,则会优先调用这个专门处理加法的函数。如果没有此函数,才会调用函数模板

相关推荐
懂点Tech2 小时前
ctfshow misc28:GIF 高度修改解题与脚本实现
开发语言·windows·python
云和数据.ChenGuang2 小时前
Python 重写(Override)深度解析:从 MRO 到 super() 的完整机制
java·开发语言·人工智能·python·langchain·1024程序员节
摇滚侠3 小时前
《On Java 中文版 基础卷》阅读笔记 实现隐藏 12
java·数据库·笔记
美狐美颜SDK开放平台3 小时前
视频美颜SDK试用DEMO阶段应该测试什么?直播APP接入实操指南
开发语言·人工智能·深度学习·音视频·美颜sdk·直播美颜sdk·第三方美颜sdk
dtq04243 小时前
C++小案例 - 日志实战
开发语言·c++
星夜离尘564 小时前
MATLAB ADC 码流触顶诊断:命中数、缺口分段与削顶不可辨识性
开发语言·matlab
码匠许师傅4 小时前
【C++三方组件】Qt 概览:桌面 C++ 的事实标准与许可证三轨
开发语言·c++·qt
码匠许师傅5 小时前
【C++三方组件】POCO:跨平台系统编程全家桶
开发语言·c++
silvamux_5 小时前
10款模型写种草笔记:可发布性、返工来源与成本数据缺口复盘
java·数据库·笔记
bkspiderx6 小时前
基于Socket的广播通信及C语言实现详解
c语言·开发语言·socket·广播·socket的广播通信