【PL理论】(26) 内存管理:C语言实现内存管理的方式 | 栈帧的分配和释放 | C/C++ 手动内存管理

news2024/11/26 2:34:02

  • 💭 写在前面:在前面的章节中,语言的语义只分配了新的内存位置,我们没有讨论内存位置的释放。在实际的语言中,内存位置在执行过程中会被不断地分配和释放。下面的章节,我们将讨论编程语言的这种内存管理,并且我们将重点介绍垃圾回收机制 (一种自动管理动态分配内存的机制) 。在接下来的讲解中,我们不会像之前那样使用编程语言的正式语义定义了。例如,尽管可以形式化地表示简单的垃圾回收方法,但这样会使内容变得过于复杂。取而代之地,我将依赖示例代码和图表来进行高层次的解释。

目录

0x00 案例研究:C语言

0x01 C语言的实现方式

0x02 回顾:栈帧的分配与释放

0x02 C/C++ 手动内存管理


0x00 案例研究:C语言

众所周知,C语言中不同种类的变量具有不同的生命周期 (存储持续时间) :

  • 全局变量在整个程序执行过程中都是存活的
  • 而函数的局部变量仅在该函数执行期间存活
  • 动态内存分配的对象 (malloc, realloc...) 在被 free 释放之前一直存活

作用域和生命周期相关但有微妙的区别 :

  • 作用域是关于名称(标识符)及其解析 
  • 生命周期是关于内存中的存在持续时间

当 f() 返回时,int i 不再存在,而 p 指向的内存在返回后仍然存在。

int n = 10;     // 随时可以访问
int* f(void) {
    int i;
    int *p;
    p = malloc(4);
    if (...) {
        return &i;   // 这完全不合理
    } else {
        return p;    // 这个有可能
    }
}

0x01 C语言的实现方式

通常,C 编译器按如下方式实现这个设计:

  • 全局变量 (GV) 放在 数据区 (data section):分配固定地址
  • 局部变量 (LV) 放在栈中:每个函数在入口时分配 栈帧 (stack frame),并在返回前释放它。
  • 将动态分配的对象放在 (Heap) 内存中
  • 这是现存标准 (没官宣),所以你可以将堆视为等同于用于动态分配的内存空间。

0x02 回顾:栈帧的分配与释放

堆帧的分配和释放,可以被视为对局部变量内存的自动管理。

0x02 C/C++ 手动内存管理

在 C/C++ 中,使用 malloc / new 动态分配的内存必须手动释放 (free / delete) 。

这种手动内存管理使得内存空间的使用更加高效,程序员可以精确控制内存的生命周期。

然而,在这个过程中程序员可能会犯下大错!触犯天条!导致项目经理大怒:

  • 内存泄漏:因为程序员忘记释放了
  • 悬空指针:忘了内存已经释放了,释放内存后,又访问了该内存


📌 [ 笔者 ]   王亦优
📃 [ 更新 ]   2024.6.10
❌ [ 勘误 ]   /* 暂无 */
📜 [ 声明 ]   由于作者水平有限,本文有错误和不准确之处在所难免,
              本人也很想知道这些错误,恳望读者批评指正!

📜 参考资料 

Microsoft. MSDN(Microsoft Developer Network)[EB/OL]. []. .

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

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

相关文章

[大模型]XVERSE-7B-chat WebDemo 部署

XVERSE-7B-Chat为XVERSE-7B模型对齐后的版本。 XVERSE-7B 是由深圳元象科技自主研发的支持多语言的大语言模型(Large Language Model),参数规模为 70 亿,主要特点如下: 模型结构:XVERSE-7B 使用主流 Deco…

【虚幻5】自学纯蓝图笔记(一)

本笔记使用v15.17.1版本的IDE ,v5.4.2的引擎 有许多小的功能记录在快捷键一节中,节省时间就不单独记录 学习本章内容时的机器太差了,i58代的CPU,16g运存,所以GIF截图会非常卡顿 指导老师: B站UP主-张亮002 …

C学习自学笔记

C学习笔记 0>C语言概述 为什么学习C语言 1)C的起源和发展------了解即可 B语言、C语言、C语言的产生地:都出自 美国贝尔实验室 2)C的特点 优点:代码量小、速度快、功能强大 缺点:危险性高、开发周期长、可移植性…

Linux--MQTT(二)通信基本原理

一、MQTT 通信基本原理 MQTT 是一种基于 客户端 - 服务端 架构的消息传输协议,所以在 MQTT 协议通信中,有两个最为重要的角色,它们便是服务端 和 客户端 。 举例:若开发板向“芯片温度”这一主题发布消息,那么服务…

【Better Lighting V2】Blender商城10周年免费送插件灯光预设和图案轮库场景打光和模拟光透过图案水滴波纹效果

Blender商城10周年免费送插件:https://blendermarket.com/birthday Better Lighting V2 灯光预设和图案轮库 模拟各种环境下光线透过物体效果 各种预设快速调整 非常简单和快速打光调色 更多详细介绍:https://blendermarket.com/products/bette…

前端老古董execCommand——操作 选中文本 样式

文章目录 ⭐前言⭐exe command api用法💖 example示例💖 测试效果 ⭐execommand和getSelection 的联系⭐总结⭐结束 ⭐前言 大家好,我是yma16,本文分享关于 前端老古董execCommand——操作选中文本。 execommand 当一个 HTML 文…

Spring的事务步骤

一、事务处理方案: Spring框架中提供的事务处理方案:一共有两种: 适合中小项目使用的, 注解方案: 注解的方式做事务用起来简单,灵活,方便,中小型项目中用它比较方便,因…

关于二分法的理解(以JS为例)

算法介绍 基本概念 二分查找算法,又称折半查找算法,是一种在有序数组中查找特定元素的高效方法。它的核心思想是将数组分成两半,然后根据目标值与中间元素的比较结果来决定是继续在左半部分还是右半部分进行搜索。 工作原理 初始化&#…

编译安装qemu-devel @FreeBSD

缘起 使用cbsd创建riscv jail的时候提示: you have no qemu-user, please install qemu-devle with BSD_USER and STATIC ops (emulators/qemu-devel) 使用pkg安装之后,创建的riscv jail启动报错: Starting jail: fbriscv, parallel timeo…

【猫狗分类】Pytorch VGG16 实现猫狗分类2-模型构建

背景 数据处理做好了,现在搭建网络 声明:整个数据和代码来自于b站,链接:使用pytorch框架手把手教你利用VGG16网络编写猫狗分类程序_哔哩哔哩_bilibili 我做了复现,并且记录了自己在做这个项目分类时候,一…

【回文 马拉车】214. 最短回文串

本文涉及知识点 回文 马拉车 LeetCode214. 最短回文串 给定一个字符串 s,你可以通过在字符串前面添加字符将其转换为回文串。找到并返回可以用这种方式转换的最短回文串。 示例 1: 输入:s “aacecaaa” 输出:“aaacecaaa” 示…

string类的使用手册

1.构造函数 补充:npos:size_t类型数据的最大值 default (1) string(); 构造空的string类对象 copy (2) string (const string& str); 拷贝构造函数(深拷贝) substring (3) string (const string& str, size_t pos, size_…

python 实现各种数据分析方法

1、相关性分析 1.1、https://zhuanlan.zhihu.com/p/669355778https://zhuanlan.zhihu.com/p/669355778

【AI学习】Together AI的新研究:Together MoA(Mixture of Agents)

第一次听说Mixture of Agents,原来Agent也能混合,有意思! 介绍 Together AI的最新研究“Together MoA”(Mixture of Agents,代理混合)是一种创新的方法,旨在通过结合多个开源大型语言模型&…

Postman使用教程(Postman详细图文教程)

本文讲解的是postman工具安装、postman安装教程、postman工具下载、postman使用教程。Postman使得得开发人员和测试人员能够更高效地与Web服务进行交互和调试。 Postman不仅支持常见的HTTP方法,如GET、POST、PUT、DELETE等,还提供了丰富的请求编辑功能&…

Linux---防火墙

文章目录 目录 文章目录 前言 一.静态防火墙:iptables iptables五链 iptables 四表 iptables控制类型 iptables命令配置 前言 这儿主要介绍Linux系统本身提供的软件防火墙的功能,即数据包过滤机制。 数据包过滤,也就是分析进入主机的网络数…

Ubuntu20.04配置ORBSLAM2并在kitti数据集序列进行实验

一、ORB-SLAM2 安装和编译 1.ORB-SLAM2下载 用以下命令在终端上下载 git clone https://github.com/raulmur/ORB_SLAM2 2.安装Pangolin 在下载了ZIP压缩包后解压缩放在ubantu的/home下(此处只要是英文路径都可以),但别急着安装Pangolin我…

STM32项目分享:智慧农业(机智云)系统

目录 一、前言 二、项目简介 1.功能详解 2.主要器件 三、原理图设计 四、PCB硬件设计 1.PCB图 2.PCB板打样焊接图 五、程序设计 六、实验效果 七、资料内容 项目分享 一、前言 项目成品图片: 哔哩哔哩视频链接: https://www.bilibili.c…

PCIe总线-RK3588 PCIe子系统简介(八)

1.PCIe子系统 RK3588 PCIe子系统如下图所示。总共拥有5个PCIe控制器。PCIe30X4(4L)支持RC和EP模式,其他4个仅支持RC模式。ITS port 1连接PCIe30X4(4L)和PCIe30X2(2L)控制器,PCIe30X4(4L)和PCIe30X2(2L)控制器使用PCIe3.0 PIPE PHY。ITS port 0连接PCIe3…

mysql:简单理解mysql mvcc的可重复读

# 原理 假设有这样的sql begin select(或update、insert、delete) ... commit当执行【begin】的时候,标记有一个新事务要开始,但是事务还没有真正开始,事务id还没有产生当执行事务里面的第一个sql语句时(…