内存分配中的堆(Memory Heap)详解
在计算机科学中,"堆"这个术语确实容易让人混淆,因为它同时用于描述两种完全不同的概念:数据结构中的堆和内存管理中的堆。上次我们讨论了数据结构中的堆,今天我将详细解释内存分配中的堆(Memory Heap)。
什么是内存分配中的堆?
内存分配中的堆(Heap)是操作系统为程序提供的一块动态内存区域,与栈(Stack)内存相对应。它是程序运行时可以动态申请和释放的内存空间。
关键特点
- 动态分配:堆内存的分配和释放由程序员显式控制(通过
malloc/free
或new/delete
等) - 全局访问:堆内存可以被程序的任何部分访问(只要持有正确的指针)
- 大小灵活:堆空间通常比栈空间大得多,且可以动态扩展(受系统内存限制)
- 生命周期:堆上分配的内存会一直存在,直到显式释放或程序结束
堆内存 vs 栈内存
特性 | 堆内存 | 栈内存 |
---|---|---|
管理方式 | 手动分配/释放 | 自动分配/释放(函数调用时) |
分配速度 | 较慢(需要查找合适内存块) | 极快(只需移动栈指针) |
内存碎片 | 可能产生 | 无碎片 |
大小限制 | 较大(受系统内存限制) | 较小(通常几MB) |
生命周期 | 直到显式释放或程序结束 | 随函数调用结束自动释放 |
访问方式 | 通过指针 | 直接通过变量名 |
线程安全 | 需要同步机制 | 每个线程有自己的栈 |
堆内存的工作原理
内存分配:
- 当程序请求堆内存时(如
malloc(100)
),内存管理器会寻找足够大的空闲块 - 如果找到,标记为已使用并返回指针;否则可能请求操作系统增加堆空间
内存释放:
- 当调用
free(ptr)
时,内存管理器将该内存块标记为空闲 - 释放的内存可以供后续分配请求重用
内存管理算法:
- 首次适应(First-fit):从开始查找第一个足够大的块
- 最佳适应(Best-fit):查找能满足要求的最小空闲块
- 最差适应(Worst-fit):总是分配最大的空闲块
堆内存的实际使用示例
C语言中的堆内存操作
#include <stdio.h>
#include <stdlib.h>int main() {// 在堆上分配一个包含10个整数的数组int *arr = (int*)malloc(10 * sizeof(int));if (arr == NULL) {printf("内存分配失败\n");return 1;}// 使用堆内存for (int i = 0; i < 10; i++) {arr[i] = i * 2;}// 打印数组内容for (int i = 0; i < 10; i++) {printf("%d ", arr[i]);}// 释放堆内存free(arr);return 0;
}
C++中的堆内存操作
#include <iostream>int main() {// 在堆上分配一个整数int* num = new int;*num = 42;// 在堆上分配一个数组int* arr = new int[10];for (int i = 0; i < 10; ++i) {arr[i] = i * 3;}std::cout << "Number: " << *num << std::endl;std::cout << "Array: ";for (int i = 0; i < 10; ++i) {std::cout << arr[i] << " ";}// 释放堆内存delete num;delete[] arr;return 0;
}
堆内存的常见问题
内存泄漏:
- 分配的内存忘记释放
- 长时间运行的程序会逐渐消耗所有可用内存
void leaky_function() {int *ptr = malloc(100 * sizeof(int));// 使用ptr...// 忘记free(ptr)!
}
悬空指针:
访问已经释放的内存
int *ptr = malloc(sizeof(int));
free(ptr);
*ptr = 10; // 危险!ptr现在是悬空指针
双重释放:
对同一块内存释放两次
int *ptr = malloc(sizeof(int));
free(ptr);
free(ptr); // 错误!
内存碎片:
- 频繁分配和释放不同大小的内存块导致碎片化
- 虽然有足够的总空闲内存,但没有足够大的连续块满足请求
现代语言中的堆内存管理
现代高级语言通常提供自动内存管理(垃圾回收)来减轻程序员负担:
Java示例
public class HeapExample {public static void main(String[] args) {// 在堆上分配对象(自动管理)Integer[] array = new Integer[100];for (int i = 0; i < array.length; i++) {array[i] = i; // 自动装箱,Integer对象分配在堆上}// 不需要手动释放内存,垃圾回收器会自动回收}
}
Python示例
def heap_example():# 列表和对象都分配在堆上lst = [x*2 for x in range(100)]obj = {"key": "value"}# Python使用引用计数和垃圾回收自动管理内存return lst# 函数返回后,如果没有引用指向lst,内存会被自动回收
堆内存的最佳实践
- 谁分配谁释放:保持内存分配和释放的对称性
- 避免内存泄漏:确保所有分配的内存最终都被释放
- 使用智能指针(C++):
#include <memory>void safe_function() {// 使用unique_ptr自动管理内存auto ptr = std::make_unique<int>(42);// 不需要手动delete,超出作用域自动释放 }
- 优先使用栈内存:对于小对象和生命周期与函数一致的对象
- 使用RAII原则:资源获取即初始化(Resource Acquisition Is Initialization)
总结
内存分配中的堆是程序运行时动态内存管理的重要机制,与数据结构中的堆是完全不同的概念。理解堆内存的特点、正确使用方法和潜在问题,对于编写高效、安全的程序至关重要。现代语言虽然提供了自动内存管理,但理解底层原理仍然有助于我们写出更好的代码。
相关文章:
内存分配中的堆(Memory Heap)详解
在计算机科学中,"堆"这个术语确实容易让人混淆,因为它同时用于描述两种完全不同的概念:数据结构中的堆和内存管理中的堆。上次我们讨论了数据结构中的堆,今天我将详细解释内存分配中的堆(Memory Heap&#x…...
【大模型理论篇】关于生成式模型中联合分布概率学习必要性以及GPT是生成式模型的讨论
1. 背景 之前我们在《生成式模型与判别式模型对比(涉及VAE、CRF的数学原理详述)》以及《生成式模型算法原理深入浅出(涉及Stable Diffusion、生成对抗网络、高斯混合模型、隐马尔可夫模型、朴素贝叶斯等算法原理分析及生成式模型解释)》中,我…...
LeetCode738☞单调递增的数字
关联LeetCode题号738 本题特点 贪心,贪心在如果非单调递增,则想要保证数字整体最大,那低数位一定为9(所有数字中最大的) 本题思路 从后向前遍历,如果递增则 什么都不做如果非递增,增非递增位…...
本节课课堂总结
课堂总结: Spark运行架构: 运行架构: Spark 框架的核心是一个计算引擎,整体来说,它采用了标准 master-slave 的结构。 如下图所示,它展示了一个 Spark 执行时的基本结构。图形中的 Driver 表示 master&…...
MyBatis中特殊符号处理总结
前言 MyBatis 是一款流行的Java持久层框架,广泛应用于各种类型的项目中。因为我们在日常代码 MyBatis 动态拼接语句时,会经常使用到 大于(>,>)、小于(<,<)、不等于(<>、!)操作符号。由于此符号包含了尖括号,而 MyBatis 使用…...
【零基础实战】Ubuntu搭建DVWA漏洞靶场全流程详解(附渗透测试示例)
【零基础实战】Ubuntu搭建DVWA漏洞靶场全流程详解(附渗透测试示例) 一、DVWA靶场简介 DVWA(Damn Vulnerable Web Application)是专为网络安全学习者设计的漏洞演练平台,包含SQL注入、XSS、文件包含等10大Web漏洞模块&…...
若依前后端分离版本从mysql切换到postgresql数据库
一、修改依赖: 修改admin模块pom.xml中的依赖,屏蔽或删除mysql依赖,增加postgresql依赖。 <!-- Mysql驱动包 --> <!--<dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId> &l…...
【补题】Codeforces Round 974 (Div. 3) E. Rendez-vous de Marian et Robin
题意:给个图,两个人分别从点1和点n出发,问最早在哪个点可以相遇,其中某些点有马,骑上去之后可以在接下来剩余的时间内都可以将路程所需时间缩短一半。 关于题目数据见原题,这里说明太累了想偷懒Problem - 2…...
MySQL集群技术
当有数据时添加slave2 #从master节点备份数据 mysqldump -uroot -ptiminglee 1 > timinglee.sql 生产环境中备份时需要锁表,保证备份前后的数据一致 mysql> FLUSH TABLES WITH READ LOCK; 备份后再解锁 mysql> UNLOCK TABLES; mysqldump命令备份的数…...
Java 中的字节码
🔍 什么是 Java 字节码(Bytecode)? 字节码是 Java 源码(.java 文件)被编译后生成的中间代码(.class 文件),它不是机器码,而是一种 面向 JVM 的指令集。 可以…...
json 转 txt 用于 yolo 训练(可适用多边形标注框_python)
json 转 txt 用于 yolo 训练(可适用多边形标注框_python) import json import os import argparse from tqdm import tqdmdef convert_label_json(json_dir, save_dir, classes):json_paths os.listdir(json_dir)classes classes.split(,)for json_pa…...
SQL注入(SQL Injection)
目录 SQL注入(SQL Injection)是什么SQL注入的危害SQL注入的常见方式1. 经典注入(Error-Based Injection)2. 联合查询注入(Union-Based Injection)3. 时间盲注(Time-Based Blind Injection)4. 布尔盲注(Boolean-Based Blind Injection)5. 堆叠注入(Stacked Queries I…...
智慧厨房的秘密:当大模型遇见智能体
智慧厨房的秘密:当大模型遇见智能体 想象一下,一家餐厅里,顾客点了一份特别定制的菜肴。厨师不仅需要知道如何制作这道菜,还得根据当天的食材情况灵活调整配方,甚至考虑到顾客的口味偏好做出微调。这一切背后…...
IDEA遇到问题汇总
问题1:【异常】IDEA中报错:无效的目标发行版本 IDEA 报错:无效的源发行版-CSDN博客 【异常】IDEA中报错:无效的目标发行版本-CSDN博客 原因是:版本不兼容不一致,需要修改jdk、maven、以及目标字节码使之相一…...
状态管理组件Pinia 简介与底层原理 、Pinia 与其他状态管理库对比、Vue3 + Element Plus + Pinia 安装配置详解
一、Pinia 简介与底层原理 1. Pinia 简介 Pinia 是 Vue3 官方推荐的状态管理库,由 Vue 核心团队开发,旨在替代 Vue2 的 Vuex。其核心目标是提供一种更简洁、直观的状态管理方案,同时充分利用 Vue3 的响应式系统和 Composition API。 2. 底…...
本地部署 opik
本地部署 opik 1. 安装2. 访问 1. 安装 克隆代码, git clone https://github.com/comet-ml/opik.git使用 Docker compose 启动, cd opik/deployment/docker-compose docker compose up -d2. 访问 启动后,您可以在浏览器中访问 localhost:…...
操作系统之进程与线程的理解(一)
对进程的理解 进程是可以并发执行的程序在某个数据集合上的运行过程,是系统进行资源分配和调度的基本单位。进程由三部分组成,程序,数据和进程控制块(简称PCB)。简单的说,进程就是程序的一次执行 为确保进…...
JS 箭头函数
只能用于声明函数表达式更简洁。替代匿名函数 设置取消点击事件的默认行为 在这里插入图片描述...
Mb,Kb,byte,bits
1MB1024KB; 1KB1024byte(字节); 1byte8bits(位); 小蓝准备用 256MB 的内存空间开一个数组,数组的每个元素都是 32 位 二进制整数,如果不考虑程序占用的空间和维护内存需要的辅助空间…...
x265 中 aqMode 和 hevcAq 的深度解析与应用技巧
aqMode 和 hevcAq 介绍 在 x265 中基本继承了 x264 中 aqmode 的思想,此外还引入了 hevcAq 算法工具,在 x265_param 结构体中有这两个参数变量开关相关解释。从声明注释可以理解,aqMode 和 x264 中 aqmode 的思想完全相似,也扩展了些功能,属于通用型自适应量化方法,基于 …...
(一)基于云平台微调大模型,以deepseek-coder-6.7b为例
一、租借rtx4090卡并创建示例 如下图,我们进入jupyter界面,然后创建笔记本 二、提前下载好模型到本地 为了节省时间,我们需要提前下好模型deepseek-ai/deepseek-coder-6.7b-instruct,然后再上传到autodl上直接本地加载。 下载方…...
【Docker基础】全面解析 Docker 镜像:构建、使用与管理
文章目录 一、Docker 镜像(Docker Image)详解1.1 Docker 镜像的结构1.2 Docker 镜像的每一层(Layer)1.3 镜像的构建过程1.4 镜像的使用1.5 镜像的优势 二、为什么需要镜像三、镜像命令3.1 命令清单3.2 详细解释 四、docker 操作案…...
3. git config
文章目录 基本概述配置级别基本用法设置配置项查看配置项删除配置项 常用配置项 基本概述 git config 的作用是:设置用户信息、编辑器、别名、仓库行为等。 配置级别 级别作用范围配置文件路径命令选项仓库级别(Local)当前仓库.git/config…...
docker 运行自定义化的服务-前端
运行自定义化的前端服务 具体如下: ①打包前端项目,形成dist包 ②编写dockerfile文件,文件内容如下: # 基础镜像(镜像名:版本号TAG) FROM nginx:1.0 # 镜像作者和相关元数据 LABEL maintainer"Atb" \version"1.0…...
error: RPC failed; HTTP 408 curl 22 The requested URL returned error: 408
在git push时报错:error: RPC failed; HTTP 408 curl 22 The requested URL returned error: 408 原因:可能是推送的文件太大,要么是缓存不够,要么是网络不行。 解决方法: 将本地 http.postBuffer 数值调整到500MB&…...
JMH 基准测试实战:Java 性能对比的正确打开方式!
📖 摘要 在Java开发中,我们经常需要比较不同实现方式的性能差异。但如何科学、准确地进行性能测试呢?本文将带你深入理解JMH(Java Microbenchmark Harness)工具,通过实战演示如何正确编写和运行基准测试&a…...
etf可以T+0交易吗?
在我国的A股市场中,部分ETF基金支持T0交易,这为投资者提供了更灵活的交易策略。 支持T0交易的ETF基金类型包括: 货币型ETF:主要投资于货币市场工具,如短期债券和银行存款,具有较高的流动性。 债券型ETF&…...
解决问题:Vscode 自动更新不匹配远程服务器版本
避免自动更新: 1. 打开:文件 - 首选项 - 设置 - 应用程序 - 更新; 2. 设置下列选项: 如果已自动更新,如何回退至原有的历史版本 : 去官网下载所需的历史版本,然后直接按流程安装,…...
【Leetcode-Hot100】盛最多水的容器
题目 解答 目的是求面积最大,面积是由两个下标和对应的最小值得到,因此唯一的问题就是如何遍历这两个下标。我采用begin和end两个变量,确保begin是小于end的,使用它们二者求面积,代码如下: 很不幸 出错了…...
FFMEPG常见命令查询
基本参数 表格1:主要参数 参数说明-i设定输入流-f设定输出格式(format) 高于后缀名-ss开始时间-t时间长度codec编解码 表格2:音频参数 参数说明-aframes设置要输出的音频帧数-f音频帧深度-b:a音频码率-ar设定采样率-ac设定声音的Channel数-acodec设定…...
欢迎来到 Codigger Store:Boby周边专区
亲爱的 Codigger 用户们,感谢你们一直以来的支持与热爱!你们的每一次代码跳跃、每一次项目成功,都离不开你们对编程的热情和对 Codigger 的信任。为了回馈大家的厚爱,我们在 Codigger Store 中特别开设了 Boby 周边专区࿰…...
决策树模型
决策树(TDS) 注意1:决策树有很多种算法,比如:ID3算法,C4.5算法,CART算法,这三个算法的区别是选择最优划分属性的方法不同,第一个是根据信息增益来选;第二个是找出信息增益高于平均水…...
解锁深度学习激活函数
在深度学习的广袤天地里,激活函数宛如隐匿于神经网络架构中的神奇密码,掌控着模型学习与表达的关键力量。今天,就让我们一同深入探究这些激活函数的奇妙世界,揭开它们神秘的面纱。 一、激活函数为何不可或缺? 想象一…...
Kubernetes 深入浅出系列 | 容器剖析之容器安全
目录 1、容器真的需要privileged权限吗?一、什么是 --privileged 权限?二、privileged 的风险到底有多大?三、常见需求场景及更安全的替代方式四、如何判断容器是否真正需要特权? 2、不以 Root 用户运行容器,真的更安全吗&#x…...
Spring Boot应用中可能出现的Full GC问题
Full GC的原理与触发条件 原理 标记-清除:首先遍历所有对象,标记可达的对象,然后清除不可达的对象。复制算法:将内存分为两部分,每次只使用其中一部分。当这部分内存用完时,将存活的对象复制到另一部分&a…...
Maven 的安装与配置(IDEA)
2025/4/9 向 一、什么是Maven Maven 是一个基于项目对象模型(Project Object Model,POM)概念的项目构建工具(所以就是一个工具),它主要用于自动化项目的构建过程,包括编译、测试、打包、部署等…...
软考中级-软件设计师 2022年下半年上午题真题解析:通关秘籍+避坑指南
📚 目录(快速跳转) 选择题(上午题)(每题1分,共75分)一、 计算机系统基础知识 🖥️💻 题目1:计算机硬件基础知识 - RISC(精简指令集计算…...
全栈开发套件Telerik DevCraft——赋能现代化应用构建
Telerik DevCraft包含一个完整的产品栈来构建您下一个Web、移动和桌面应用程序。它使用HTML和每个.NET平台的UI库,加快开发速度。Telerik DevCraft提供完整的工具箱,用于构建现代和面向未来的业务应用程序,目前提供UI for ASP.NET MVC、Kendo…...
Windows + vmware + ubuntu+docker + docker-android实现Android模拟器构建和启动
文章目录 引言编译启动过程玩下adb最后 引言 Windows vmware ubuntudockerdocker-android实现Android模拟器启动 编译启动过程 #下载docker-android git clone https://github.com/budtmo/docker-android.gitmaqiubuntu:~/docker-android$ git remote -v origin https://…...
远程团队协作效率低,如何优化
在远程工作的环境中,团队协作效率低下成为许多企业面临的一大挑战。随着全球化和技术进步,远程团队的出现成为企业的常态,但由于沟通不畅、任务管理不明确、缺乏团队凝聚力等问题,往往会影响团队的整体效率。为了优化远程团队的协…...
Oracle 19C 通过 ODBC 连接 SQL Server 数据库指南 (Red Hat 7)
前言 本指南详细说明如何在 Red Hat Enterprise Linux 7 系统上配置 Oracle 19C 通过 ODBC 连接 SQL Server 数据库。这种异构数据库连接方式称为 Oracle Heterogeneous Services,允许 Oracle 数据库直接访问非 Oracle 数据源。 系统要求 操作系统:Red Hat Enterprise Linu…...
【MYSQL从入门到精通】数据类型及建表
一些基础操作语句 1.使用客户端工具连接数据库服务器:mysql -uroot -p 2.查看所有数据库:show databases; 3.创建属于自己的数据库: create database 数据库名;create database if not exists 数据库名; 强烈建议大家在建立数据库时指定编…...
鸿蒙开发中的并发与多线程
文章目录 前言异步并发 (Promise和async/await)多线程并发并发能力选择耗时任务并发执行场景常见业务场景 常驻任务并发执行场景常见业务场景 传统共享内存并发业务长时任务并发执行场景常见业务场景 并发任务管理线程间通信同语言线程间通信(ArkTS内)线…...
ruby self
在 Ruby 中,self 是一个指向当前对象的特殊变量,它的值根据代码的上下文动态变化。理解 self 的指向是掌握 Ruby 面向对象编程的关键。以下是详细解析: 一、self 的核心规则 self 始终指向当前方法的执行者(即调用方法的对象&…...
Kotlin 学习-集合
/*** kotlin 集合* List:是一个有序列表,可通过索引(下标)访问元素。元素可以在list中出现多次、元素可重复* Set:是元素唯一的集合。一般来说 set中的元素顺序并不重要、无序集合* Map:(字典)是一组键值对。键是唯一的…...
封装方法的辨析
equals //字符串 str1.equals(str2); //list的两个实现类 list1.equals(list2); //map的两个实现类 //比较所有的键值对是否相同 map1.equals(map2); //数组(包括string类型) //比较内容是否相同 Arrays.equals(array1, array2); contains 基本都有…...
解决 IntelliJ IDEA 中 Maven 项目左侧项目视图未显示顶层目录问题的详细步骤说明
以下是解决 IntelliJ IDEA 中 Maven 项目左侧项目视图未显示顶层目录问题的详细步骤说明: 1. 切换项目视图模式 默认情况下,IDEA 的项目视图可能处于 Packages 模式,仅显示代码包结构,而非物理目录。 操作步骤: 点击…...
CMIP6数据分析与可视化、降尺度技术与气候变化的区域影响、极端气候分析
当前的CMIP6计划相较于前代模型,在空间分辨率、物理过程表达和地球系统组件耦合等方面均有显著提升。 一:气候变化研究的AI新视角 1、气候模型基础与全球气候模型(GCM) 全球气候(环流)模型的基本原理、发…...
如何精准控制大模型的推理深度
论文标题 ThinkEdit: Interpretable Weight Editing to Mitigate Overly Short Thinking in Reasoning Models 论文地址 https://arxiv.org/pdf/2503.22048 代码地址 https://github.com/Trustworthy-ML-Lab/ThinkEdit 作者背景 加州大学圣迭戈分校 动机 链式推理能显…...
1. Git 下载和安装
文章目录 Git 下载Git 安装(以windows为例)Git 使用(以windows为例) Git 下载 1.进 Git 官网 https://git-scm.com/downloads 2.选择对应的操作系统 3.选择对应的操作系统位数 Git 安装(以windows为例)…...