C++学习内存管理

news2025/3/17 16:25:09

1.概念的介绍

总括:

1. 栈(Stack)

  • 存储内容

    • 局部变量(包括函数参数、非静态局部变量)。

    • 函数调用的上下文信息(如返回地址、寄存器状态等)。

    • 特点

      • 内存由编译器自动分配和释放。

      • 生命周期与函数调用相关,函数结束时自动释放。

      • 大小有限,通常较小(几MB)。

      • 访问速度快。

      • 2.堆区

      • 存储内容

        • 动态分配的内存(通过 newmalloc 等分配的内存)。

        • 需要手动管理内存的分配和释放。

      • 特点

        • 内存由程序员手动管理(使用 new/delete 或 malloc/free)。

        • 生命周期由程序员控制,直到显式释放。

        • 大小较大,受系统内存限制。

        • 访问速度较慢。

        • void bar() {
              int* ptr = new int(20); // ptr 指向堆区分配的内存
              delete ptr; // 手动释放堆区内存
          }

        • 3. 静态区(Static/Global Area)

        • 存储内容

          • 全局变量。

          • 静态变量(包括静态局部变量和静态成员变量)。

          • 特点

            • 内存分配在程序启动时完成,程序结束时释放。

            • 生命周期贯穿整个程序运行期间。

            • 访问速度较快。

            • int globalVar = 30; // 全局变量,存储在静态区

              void baz() {
                  static int staticVar = 40; // 静态局部变量,存储在静态区
              }

            • 4. 常量区(Constant Area)

            • 存储内容

              • 常量数据(如字符串常量、const 修饰的常量变量)。

              • 只读数据。

            • 特点

              • 内存分配在程序启动时完成,程序结束时释放。

              • 数据不可修改。

              • 访问速度较快。

              • const int constVar = 50; // 常量变量,存储在常量区
                const char* str = "Hello, World!"; // 字符串常量,存储在常量区

                • 2.new和delete

                  1.new

                  1.int *ptr1=new int;创建一个Int类型的变量

                  2.int*ptr2=new int[10];创建10个int类型的变量。

                  3.int*pt3r=new int[10]{1,2,3,4};这里意思是创建10个int类型的空间,然后将前四个分别初始化为1,2,3,4,然后后面的都初始化为0。

                  4.当int变为自定义类类型的时候,会自动调用构造函数。

                  2.delete

                  1.上面三个地址删除时调用delete,写法分别是,delete ptr1,

                  delete []ptr2,delete[]ptr3;

                  申请连续空间用new[],删除连续的空间delete[]。

                  3.new和delete操作自定义类型

                  当new和delete对自定义类型进行操作时,会自动调用构造函数和析构函数。

                  4.operator new和operator delete

                  new和delete在底层会调用operator new和operator delete进行动态内存空间管理。operator new operator delete它们两个是系统提供的全局函数,new调用opreator new,delete调用operator delete来释放和申请空间。     

                  5.new和delete的实现原理     

                  6.定位new           

                  定位new是在已分配空间的部分调用构造函数初始化对象  ,一般配合内存池使用,因为一般内存池中的类对象是没有初始化的。

                  7.malloc和new的区别

                  1.malloc是函数,new是操作符。

                  2.malloc不会初始化,new会初始化。

                  3.malloc申请空间需要手动计算空间的大小,new可以不同后面直接跟类型(有内置类型int,char等,也有自定义类型date等),如果是多个对象直接在[]里面跟上创建对象的个数即可。

                  4.malloc创建的空间返回的指针是void*,必须强制转换,new可以不用,因为new在使用的时候后面跟了类型。

                  5.malloc开辟空间失败时返回NULL,但是new不会,它会抛出异常。需要来接收。

                  6.申请自定义类型对象时,new会调用构造函数,delete在释放空间前会调用析构函数释放自定义对象的资源,但是malloc和free不会。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2316709.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

git使用。创建仓库,拉取分支,新建分支开发

文章目录 安装 git自己新建仓库,进行代码管理合作开发的流程拉去主分支代码查看本地分支的状态查看远程分支查看远程的仓库信息本地分支切换切换并创建分支提交代码 made by NJITZX git 是一个版本控制工具,真正开发项目中是多个人开发一个项目的&#…

itsdangerous加解密源码分析|BUG汇总

这是我这两天的思考 早知道密码学的课就不旷那么多了 纯个人见解 如需转载,标记出处 目录 一、官网介绍 二、事例代码 源码分析: 加密函数dump源码使用的函数如下: 解密 ​编辑 ​编辑 关于签名: 为什么这个数字签名没有…

不像人做的题————十四届蓝桥杯省赛真题解析(上)A,B,C,D题解析

题目A:日期统计 思路分析: 本题的题目比较繁琐,我们采用暴力加DFS剪枝的方式去做,我们在DFS中按照8位日期的每一个位的要求进行初步剪枝找出所有的八位子串,但是还是会存在19月的情况,为此还需要在CHECK函数…

JavaScript 中 call 和 apply 的用法与区别

文章目录 前言一、 call 方法1.1 基本用法1.2 传递多个参数 二、apply 方法2.1 基本用法2.2 传递数组参数 三、call 和 apply 的区别四、实际应用场景4.1 借用方法4.2 继承与构造函数 五、总结 前言 在 JavaScript 中,call 和 apply 是两个非常重要的函数方法&…

面试系列|蚂蚁金服技术面【1】

哈喽,大家好!今天分享一下蚂蚁金服的 Java 后端开发岗位真实社招面经,复盘面试过程中踩过的坑,整理面试过程中提到的知识点,希望能给正在准备面试的你一些参考和启发,希望对你有帮助,愿你能够获…

使用傅里叶变换测量声卡的频率失真

文章目录 一、说明二、关于声卡的技术详述三、实验代码获取四、结论 一、说明 假如我希望使用我的声卡来模拟软件无线电,利用声音而不是射频信号。我的声卡能胜任这项任务吗?本文将研究一种技术来找出答案。另外,需要了解音频技术的读者也可…

【HTML5】01-HTML摆放内容

本文介绍HTML5摆放标签的知识点。 目录 1. HTML概念 2. HTML骨架 3. 标签的关系 4. 标题标签 5. 段落标签 6. 换行和水平线 7. 文本格式化标签 8. 图像标签 图像 - 属性 9. 路径 相对路径 绝对路径 10. 超链接标签 11. 音频标签 12. 视频标签 1. HTML概念 HTM…

内存管理:

我们今天来学习一下内存管理: 1. 内存分布: 我们先来看一下我们下面的图片: 这个就是我们的内存,我们的内存分为栈区,堆区,静态区,常量区; 我们的函数栈帧开辟消耗的内存就是我们…

设计模式使用Java案例

代码设计要有可维护性,可复用性,可扩展性,灵活性,所有要使用设计模式进行灵活设计代码 创建型 简单工厂模式(Simple Factory) 简单工厂模式(Simple Factory Pattern)是一种创建型…

模运算的艺术:从基础到高阶的算法竞赛应用

在算法竞赛中,模运算(取模运算)是一个非常重要的概念,尤其在处理大数、防止溢出、以及解决与周期性相关的问题时。C 中的模运算使用 % 运算符,但它的行为和使用场景需要特别注意。 1. 模运算的基本概念 模运算是指求一…

ST电机库电流采样 三电阻单ADC

一、概述 下图是三电阻采样的电路结构 其中流过三相系统的电流I1、I2、I3遵循以下关系: 因此,为了重建流过普通三相负载的电流,在我们可以用以上公式计算的情况下,只需要对三相中的两相进行采样即可。 STM32的ADC可以很灵活的配置成同步采集两路ADC数据,…

现代密码学 | 具有保密和认证功能的安全方案

1.案例背景 1.1 2023年6月,微软云电子邮件泄露 事件描述: 2023年6月,属于多家美国政府机构的微软云电子邮件账户遭到非法入侵,其中包括了多位高级政府官员的电子邮件。据报道,美国国务院的10个邮件账户中共有6万封电…

一款基于Python的从常规文档里提取图片的简单工具开发方案

一款基于Python的从常规文档里提取图片的简单工具开发方案 1. 环境准备 安装必需库 pip install python-docx PyMuPDF openpyxl beautifulsoup4 pillow pip install pdfplumber # PDF解析备用方案 pip install tk # Python自带,无需安装工具选择 开发环…

JetBrains(全家桶: IDEA、WebStorm、GoLand、PyCharm) 2024.3+ 2025 版免费体验方案

JetBrains(全家桶: IDEA、WebStorm、GoLand、PyCharm) 2024.3 2025 版免费体验方案 前言 JetBrains IDE 是许多开发者的主力工具,但从 2024.02 版本起,JetBrains 调整了试用政策,新用户不再享有默认的 30 天免费试用…

Docker生存手册:安装到服务一本通

文章目录 一. Docker 容器介绍1.1 什么是Docker容器?1.2 为什么需要Docker容器?1.3 Docker架构1.4 Docker 相关概念1.5 Docker特点 二. Docker 安装2.1 查看Linux内核版本2.2 卸载老版本docker,避免产生影响2.3 升级yum 和配置源2.4 安装Dock…

Linux内核传输层UDP源码分析

一、用户数据包协议(UDP) 1.UDP数据报头 UDP 提供面向消息的不可靠传输,但没有拥塞控制功能。很多协议都使用 UDP,如用于 IP 网络传输音频和视频的实时传输协议 (Real-time Transport Protocol,RTP),此类型…

FPGA学习(二)——实现LED流水灯

FPGA学习(二)——实现LED流水灯 目录 FPGA学习(二)——实现LED流水灯一、DE2-115时钟源二、控制6个LED灯实现流水灯1、核心逻辑2、代码实现3、引脚配置4、实现效果 三、模块化代码1、分频模块2、复位暂停模块3、顶层模块 四、总结 一、DE2-115时钟源 DE2-115板子包含一个50MHz…

Linux如何在设备树中表示和引用设备信息

DTS基本知识 dts 硬件的相应信息都会写在.dts为后缀的文件中,每一款硬件可以单独写一份xxxx.dts,一般在Linux源码中存在大量的dts文件,对于arm架构可以在arch/arm/boot/dts找到相应的dts,一个dts文件对应一个ARM的machie。 dtsi 值…

Matlab 汽车振动多自由度非线性悬挂系统和参数研究

1、内容简介 略 Matlab 169-汽车振动多自由度非线性悬挂系统和参数研究 可以交流、咨询、答疑 2、内容说明 略 第二章 汽车模型建立 2.1 汽车悬架系统概述 2.1.1 悬架系统的结构和功能 2.1.2 悬架分类 2.2 四分之一车辆模型 对于车辆动力学,一般都是研究其悬…

生活中的可靠性小案例11:窗户把手断裂

窗户把手又断了,之前也断过一次,使用次数并没有特别多。上方的图是正常的把手状态,断的形状如下方图所示。 这种悬臂梁结构,没有一个良好的圆角过渡,导致应力集中。窗户的开关,对应的是把手的推拉&#xff…