malloc/free实现 源码

glibc malloc源码深度解析:_int_malloc六大路径与实战性能优化 内存管理是系统性能的基石,而malloc作为最基础的内存分配接口,其内部实现直接影响程序时延与资源利用率。glibc的ptmalloc通过chunk与bin结构构建了分级分配策略,fastbin、smallbin提供O(1)快速路径,unsorted bin承担刚释放内存的复用,largebin以空间换时间处理大块请求。理解这些路径的触发条件和设计动机,不仅能精准定位线上内存抖动、P99延迟突刺等性能问题,还能为自定义内存池、多线程arena优化提供理论依据。本文从_int_malloc源码出发,拆解六大分 阅读详情

采用双向链表,首次适配算法,为将来的优化提供支持:每次释放时从最近一次分配处的下一空闲块开始比较、查找。单任务版本,多任务下需要对分配和释放加锁。

#include "stdafx.h"
#include <stdlib.h>
#include <stdio.h>
#include <time.h>
#include <memory.h>


typedef struct tagMemMgr_t
{
	struct tagMemMgr_t *pNext;
	struct tagMemMgr_t *pPrev;
	int					Size;
} MemMgr_t;

#define	 MEM_HDR_SIZE	sizeof(MemMgr_t)

static MemMgr_t	*FreeHeader;


void InitMemMgr(void * pMemory, int Size)
{
	FreeHeader= (MemMgr_t *)pMemory;

	FreeHeader->pNext = NULL;
	FreeHeader->pPrev = NULL;
	FreeHeader->Size  = Size - MEM_HDR_SIZE;
}

void *_malloc(int Size)
{
	MemMgr_t *p;
	int RemainingSize;

	Size = (Size + 3)/4 * 4;

	p = FreeHeader;
	while(NULL != p) {
		if (p->Size >= Size) {
			break;
		}
		else {
			p = p->pNext;
		}
	}
	if (NULL == p) return NULL;

	RemainingSize = p->Size - Size;
	if(RemainingSize > MEM_HDR_SIZE) { /* split the free block into 2 free block */
		MemMgr_t *q;

		q = (MemMgr_t *)((char *)p + MEM_HDR_SIZE + Size);
		
		q->Size = RemainingSize - MEM_HDR_SIZE;
		q->pNext = p->pNext;
		q->pPrev = p->pPrev;
		
		if(p->pPrev == NULL) {
			FreeHeader = q;
		}
		else {
			p->pPrev->pNext = q;
		}
		
		if(p->pNext != NULL) {
			p->pNext->pPrev = q;
		}

		p->Size = Size;
	}
	else {
		/* delete p */

		if(p->pPrev == NULL) {
			FreeHeader = p->pNext;
		}
		else {
			p->pPrev->pNext = p->pNext;
		}

		if(p->pNext != NULL) {
			p->pNext->pPrev = p->pPrev;
		}
	}

	return (char *)p + MEM_HDR_SIZE;
}

/* q merges to p */
static MemMgr_t * MemMerge(MemMgr_t *p, MemMgr_t *q)
{
	if(q == NULL) {
		return NULL;
	}

	if(((char *)p + MEM_HDR_SIZE + p->Size) == (char *)q) {
		/* delete q */
		p->pNext = q->pNext;
		if(q->pNext != NULL) {
			q->pNext->pPrev = p;
		}

		p->Size += MEM_HDR_SIZE + q->Size;

		return p;
	}
	else {
		return NULL;
	}
}

void _free(void * pMem)
{
	MemMgr_t *pToFree, *p, *q;

	pToFree = (MemMgr_t *)((char *)pMem - MEM_HDR_SIZE);

	if(FreeHeader == NULL) {
		FreeHeader = pToFree;
		FreeHeader->pNext = NULL;
		FreeHeader->pPrev = NULL;
		return;
	}

	q = FreeHeader;
	p = q->pPrev;
	while(q != NULL && pToFree > q) {
		p = q;
		q = q->pNext;
	}

	if(p == NULL) { /* pToFree should be the first free block */
		pToFree->pNext = FreeHeader;
		pToFree->pPrev = NULL;
		FreeHeader->pPrev = pToFree;

		FreeHeader = pToFree;

		MemMerge(FreeHeader, FreeHeader->pNext);
	}
	else {
		if(q == NULL) { /* pToFree as the last free block */
			pToFree->pNext = NULL;
			pToFree->pPrev = p;
			p->pNext = pToFree;

			MemMerge(p, pToFree);
		}
		else { /* pToFree insert into the free list */
			pToFree->pNext = q;
			pToFree->pPrev = p;
			p->pNext = pToFree;
			q->pPrev = pToFree;

			if(NULL != MemMerge(p, pToFree)) {
				MemMerge(p, q);
			}
			else {
				MemMerge(pToFree, q);
			}
		}
	}
}

static int OutputFreeList(void)
{
	int Count = 0;
	MemMgr_t *p = FreeHeader;

	while(p != NULL) {
		printf("%08X(% 5d)->", p, p->Size);
		p = p->pNext;
		Count++;
		if(Count % 30 == 0) {
			printf("\n");
		}
	}

	printf("\nFreeListLength:%d\n", Count);

	return Count;
}

#define	MAX_ALLOC_SIZE		1024
#define	TEST_MEM_ARRAY_SIZE	1000
#define	FREE_MEM_SIZE		(MAX_ALLOC_SIZE * TEST_MEM_ARRAY_SIZE)

typedef void * void_p_t;

int main(int argc, char* argv[])
{
	void *p;
	void_p_t pMem[TEST_MEM_ARRAY_SIZE];
	int i;
	int RunTimes = 1000000;

	if(argc > 1) {
		sscanf(argv[1], "%i", &RunTimes);
	}

	p = malloc(FREE_MEM_SIZE);
	if(NULL == p) return -1;

	printf("FreeMemoryStartAddress:%08X\n", p);
	InitMemMgr(p, FREE_MEM_SIZE);

	for(i = 0; i < TEST_MEM_ARRAY_SIZE; i++) {
		pMem[i] = NULL;
	}

	i = 0;
	srand((unsigned)time(NULL));
	while(RunTimes--) {
		int MemLoc;
		int MemSize;

		MemLoc = rand() % TEST_MEM_ARRAY_SIZE;

		if(pMem[MemLoc] != NULL) {
			_free(pMem[MemLoc]);
		}
		
		MemSize = rand() % MAX_ALLOC_SIZE;
		pMem[MemLoc] = _malloc(MemSize);
		if(NULL == pMem[MemLoc]) {
			printf("Out of memory\n");
			break;
		}
		
		memset(pMem[MemLoc], 0x00, MemSize);
		printf("%08X(% 5d)% 8d\n", pMem[MemLoc], MemSize, i++);
	}

	OutputFreeList();
	for(i = 0; i < TEST_MEM_ARRAY_SIZE; i++) {
		if(pMem[i] != NULL) {
			_free(pMem[i]);
		}
	}
	OutputFreeList();

	free(p);

	return 0;
}


glibc源码分析-malloc-free 简要分析malloc和free源码 阅读详情

相关推荐

深入VC2010 CRT源码:内存管理与文件IO的实现原理与调试技巧

C运行时库(CRT)是Windows平台C/C++程序开发的基础支撑,它封装了内存管理、文件操作等核心功能。理解CRT的工作原理,需要从静态链接与动态链接的本质区别入手,这决定了程序的内存布局和模块间协作方式。在技术价值上,掌握CRT源码能帮助开发者诊断堆损坏、内存泄漏等底层问题,提升调试复杂运行时错误的能力。应用场景包括高性能优化、多线程同步机制设计以及跨模块兼容性处理。本文以VC2010的CRT源码为例,重点剖析了malloc和free的内存管理机制,以及fopen和FILE结构体的文件IO实现,通过搭

weixin_34072637的博客 407

malloc()函数源代码

#include "types.h" #include "stddef.h" #include "string.h" /* Imported functions */ extern void prom_printf (char *fmt, ...); static char *malloc_ptr = 0; static char *malloc_top = 0; static char *l

lxmky的专栏 1万+

C++内存泄漏检测:重载new/delete与malloc/free双轨拦截

内存泄漏是C++程序中常见却难以定位的运行时问题,其本质是堆内存分配后未被正确释放。原理上,泄漏源于未被监控的动态分配路径——不仅包括`new`/`delete`,还涵盖`malloc`/`free`及第三方库调用。传统日志分析或符号扫描方案依赖PDB、启动慢、不兼容Release构建;而基于分配钩子的拦截技术,通过重载全局操作符与宏替换实现零依赖、低开销的全路径覆盖。该方法具备工程实用价值:支持VS一键集成、跨平台可移植、CI自动化回归,并能精准定位`std::vector`扩容、`shared_ptr`

weixin_29274337的博客 190

Malloc源码解读三——Bins与Arena

define bin_index(sz) //首先宏定义,这里表示了替换 bin_index(sz) 申请的内存大小 ,函数体 unsigned long (sz) 意思就是,不管传进来的数值为多少,都会被替换为 无符号的long类型,然后右移>>9 == 0?这里关键点,在于对释放内存的处理,作者是这样想的,在对一个刚刚释放的内存块,并没有对ta进行立即的回收,而是把ta留在了与ta相同大小的内存块中。那就如上所说,省略的这一次合并节省了合并,再分裂,再搜索的时间,这样一步换三步的策略。

qq_36912885的博客 719

malloc的实现源码

malloc的源码实现,很方便移植。特别是在BootLoader或者单片机开发过程中,想要实现malloc、free、realloc等函数时,只需要将压缩包里的malloc.c和malloc.h拷贝到你的工程的同一个目录下,编译链接进去即可。压缩包里的test.c提供了一个使用示例供参考。【该malloc的实现改编自uboot源码】

基于malloc与free函数的实现代码及分析

用于内存管理的malloc与free这对函数,对于使用C语言的程序员应该很熟悉。前段时间听说有的IT公司以“实现一个简单功能的malloc”作为面试题,正好最近在复习K&R,上面有所介绍,因此花了些时间仔细研究了一下。毕竟把题目做出来是次要的,了解实现思想、提升技术才是主要的。本文主要是对malloc与free实现思路的介绍,蓝色部分文字是在个人思考中觉得比较核心的东西;另外对于代码的说明,有一些K&R上的解释,使用绿色加亮。   在研究K&R第八章第五节的实现之前,不妨先看看其第五章第四节的alloc/afree实现,虽然这段代码主要目的是展示地址运算。 代码如下:alloc实现 #def

改进的malloc/free实现源码

此malloc/free实现增加空闲块添加功能:AddFreeMemBlock #include "stdafx.h" #include #include #include #include typedef struct tagMemMgr_t { struct tagMemMgr_t *pNext; struct tagMemMgr_t *pPrev; int Siz

binaryhead的专栏 952

深入解析FastDDS:SHM与DATA-SHARING传输层的性能对比与实现细节

本文深入对比了FastDDS中SHM与DATA-SHARING两种传输层的实现机制与性能差异。SHM采用端口化共享内存模型,存在两次数据拷贝;而DATA-SHARING通过共享历史实现真正的零拷贝,大幅降低延迟与CPU占用。文章结合实战测试数据,为机器人、自动驾驶等高实时性场景提供了关键的性能优化选型与配置指南。

weixin_28358083的博客 231

C++中 new和malloc的区别

C++中new与malloc的区别

Balaam' s blogs 2730

Windows环境下DataEase一站式安装指南(含WSL2+Docker配置)

本文详细介绍了在Windows环境下通过WSL2和Docker快速部署DataEase的完整教程。从WSL2配置、Docker环境搭建到DataEase离线安装,逐步指导用户完成一站式部署,特别适合需要快速搭建数据分析平台的开发者。教程包含常见问题解决方案和性能优化技巧,帮助用户高效使用这款国产开源数据可视化工具。

weixin_42526166的博客 394

K-means算法代码实现(python)

K-means算法代码实现以及解决质心选择问题 计算距离 距离通常使用欧几里得距离来衡量 def euclDistance(vector1, vector2): return np.sqrt(sum((vector2 - vector1) ** 2)) 初始化质心 def initCentroids(data, k): numSamples, dim = data.shape ...

江南小帅瓜的博客 1万+

嵌入式内存管理实战:malloc/free、栈溢出与物理内存布局

在嵌入式系统中,内存管理远非标准C库的简单调用,而是直面物理地址空间、无MMU保护、实时性约束的核心工程问题。其原理根植于堆块链表管理、地址对齐规则、临界区同步机制及多级内存域(如DTCM/AXI-SRAM)的硬件特性。技术价值在于保障系统长期稳定运行,避免HardFault、数据覆盖与偶发死机等隐蔽故障。典型应用场景包括FreeRTOS任务堆分配、中断上下文内存申请、DMA缓冲区管理及低功耗设备资源优化。本文聚焦嵌入式malloc/free底层行为与栈溢出防控,揭示真实项目中70%偶发性崩溃背后的内存认知

weixin_34416649的博客 365

AD-Copilot 论文解读:把“大模型看图”升级为“对照检验”的工业异常检测助手

本文提出AD-Copilot,一个面向工业异常检测的视觉语言助手,通过视觉上下文比较解决现有方法的不足。针对工业场景中多模态大模型表现不佳的问题,作者指出核心原因在于缺乏工业数据和比较能力不足。为此,论文提出三个关键贡献:构建Chat-AD数据集,设计Comparison Encoder显式建模图像差异,以及采用多阶段训练策略。实验表明,该方法在MMAD基准上达到82.29%准确率,定位任务提升3.35倍,并展现出良好的泛化能力。消融实验验证了比较模块的有效性,表明其成功源于高质量比较数据与显式比较模块的协

blanokvaffy的博客 331

深入 memleax 工作原理:ptrace 附加与断点 Hook 如何实时追踪 malloc/free

memleax 是一款面向"正在运行"的进程的内存泄漏检测工具:它通过 **ptrace 附加** 到目标进程,用 **断点 Hook** 实时追踪 malloc/free 等内存分配与释放调用,全程不需要重新编译、不需要重启程序,就能把"存活过久"的内存块当作泄漏实时报告出来。这篇文章不堆代码,用通俗的语言把 memleax 工作原理从附加到报告的完整链路拆解清楚,并聊聊它的性能代价与适用场景。

gitblog_00877的博客 947

码农新宠大对决:GitHub Copilot、通义灵码和CodeLlama谁主沉浮?

本文对三款主流AI编程工具GitHub Copilot、通义灵码和CodeLlama进行了全面对比分析。GitHub Copilot在多语言支持和代码质量上表现突出;通义灵码在中文理解和阿里云生态集成方面优势明显;CodeLlama则以开源可定制见长。文章从代码生成、理解能力、多语言支持、使用体验等维度展开评测,并结合实际案例说明不同开发者群体的适用选择。建议新手可优先考虑通义灵码,经验开发者适合GitHub Copilot,而有定制需求的企业团队则可选择CodeLlama。随着AI技术发展,这些工具将持续

远程部署调试 运行安装 项目调试 二次开发 项目技术新 持续迭代 部分源码免费分享 675

PowerShell 升级到 v7 并设置为默认版本(详细操作指南)

本文详细介绍了如何将PowerShell升级到v7并设为默认版本。PowerShell 7基于.NET Core构建,具有跨平台支持、性能优化和新语法特性等优势。文章提供了多种安装方法(MSI安装包、包管理器)和设置默认版本的方案(修改PATH、创建符号链接、配置编辑器等),同时涵盖企业批量部署解决方案和常见问题处理。通过升级到PowerShell 7,用户可以获得更强大的命令行体验,适用于开发、运维和自动化场景。

huluang的专栏 4291

从‘堆’的视角看malloc:手把手带你用GDB调试内存分配与释放全过程

本文深入探讨了C语言中malloc和free的动态内存管理机制,通过GDB调试器手把手演示内存分配与释放的全过程。从堆内存基础观察到复杂分配模式分析,揭示了glibc内存管理的底层实现细节,并提供了常见内存问题的诊断方法和性能优化技巧,是C开发者深入理解内存管理的实用指南。

weixin_30629653的博客 493

如何通过插值法计算cell delay?

插值法的公式:Z = A + B * X + C * Y + D * X * Y,其中X为input transition,Y为output load,A、B、C、D为四个参数,Z为delay值。从而得到Z=-0.086176 + 11.5493 * x + 0.65917 * y - 24.859 * x * y,当X=0.014930、Y=0.296311时,得到Z=0.1716ns。从而得到A = 0.08075,B = 3.47539,C = 0.04008,D = 0.01648。

芯冰乐 1076

DeepSeek 接入 Hermes 完整指南:Key、Base URL 与模型一次配齐

假设你手里已经有一个 DeepSeek API Key,想让它驱动 Hermes —— Nous Research 出品的开源自我进化 AI Agent,能在终端里陪你写代码、拆长文档、跑多轮复杂任务。DeepSeek 接入 Hermes 的终点长什么样?在新终端敲下 `hermes`,发一句话,DeepSeek 给出连贯回复,之后换模型、处理长文档都不用再动配置。这就是本文的验收标准,下文倒推要

gitblog_00521的博客 182

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

C++内存管理:从malloc到operator new源码级拆解

内存管理是C++面试必问、开发踩坑的重灾区。本文从进程地址空间出发,逐行拆解operator new/delete的源码实现,对比malloc/free与new/delete的本质差异(不只是"调不调构造函数"),并梳理placement new和new[]计数字段等容易被忽略的实现细节。不讲八股,只讲底层逻辑。

2501_93751162的博客 360

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

C++内存管理底层探秘:从malloc原理到内存池优化实战

内存管理是计算机科学的核心基础概念,它负责程序运行时内存资源的分配与回收。其原理涉及操作系统虚拟内存机制、分配器算法(如空闲链表、伙伴系统)以及硬件MMU的协同工作。理解内存管理机制的技术价值在于能够编写出高性能、低延迟且稳定的系统软件,尤其在游戏开发、高频交易、嵌入式系统等对资源极度敏感的应用场景中至关重要。本文以C++为背景,深入剖析Glibc的ptmalloc等通用内存分配器的底层实现,并探讨如何通过定制内存池和选择高效分配器(如tcmalloc、jemalloc)来解决内存碎片和多线程性能瓶颈等实际

chuchen7021的博客 388

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

堆初步探索

本文介绍了Linux系统中堆(Heap)的基本概念和操作机制。堆是程序虚拟地址空间中用于动态内存分配的区域,由低地址向高地址增长,通过堆管理器(如glibc的ptmalloc)进行管理。堆管理器负责响应用户的内存申请请求,并与操作系统交互获取内存,同时管理已释放的内存以供重复利用。 文章详细分析了堆在内存布局中的位置,包括内核空间、栈区、共享库、堆区、数据段和代码段等区域的分布。重点解析了堆的基本操作,特别是malloc函数的实现逻辑,包括其源码中的关键步骤:检查Hook函数、获取分配区(Arena)并加锁

2501_92707847的博客 217

CTF Wiki:深入解析 glibc ptmalloc2 tcache 机制(结构与源码级原理)

> 本指南聚焦 CTF Wiki 仓库 [ptmalloc2 实现分析](https://link.gitcode.com/i/e132eda47ce57dea99f091ca50bec288) 一文所讲解的 tcache(thread cache)机制,结合 [tcache 利用](https://link.gitcode.com/i/b49471d292c9c1589811d9c653868a

gitblog_00045的博客 1004

南京大学 操作系统 (JYY) 学习笔记:C 标准库与动态内存管理的艺术 (libc & malloc)

这篇文章摘要(150字以内): 本文是操作系统系统调用系列的第9讲,探讨了系统调用的"非必要不实现"设计原则,指出内核仅提供必要功能以避免代码膨胀。在介绍底层系统调用的局限性后,文章转向C语言的核心库libc,重点解析动态内存管理的关键函数malloc和free的实现机制。通过一个极简的C程序示例_start(),展示了系统调用的底层使用方式。文章旨在帮助读者理解从底层系统调用到高级库函数的过渡,以及操作系统如何通过精简设计为应用程序提供基础支持。

Rain050415的博客 508

malloc arena_lock

malloc arena_lock

xiaozhi 172
上一篇: 二进制转十进制例程
下一篇: 改进的malloc/free实现源码
二进制脑袋
博客等级 码龄25年 25粉丝 21原创
评论 5
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值