new和malloc分配的内存是否连续

本文探讨了C/C++内存模型中的连续性概念,并解释了new和malloc在逻辑上的连续性与物理实现上的区别,帮助读者理解内存分配的底层原理。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

supermegaboy大牛如是说“在C/C++的内存模型范畴内是连续的,但对于实现不一定是连续的。

抽象与实现之间仅具有结果等效,不具有等同语义。

当我们问,在C/C++中,new和malloc分配的内存是否连续?那么回答一定是连续;但如果问某个执行环境中new和malloc分配的内存是否连续?那么回答就变成了不一定连续,但是从观测者角度看来,这个实现必须表现出连续的效果。”

 

 

也就是说 在逻辑上 是连续的(所以我们使用时,可以将其当作连续的内存)  但是在内存的物理实现上不一定是等效的 。

### 自定义 `mymalloc` 函数实现内存分配过程 为了理解自定义的 `mymalloc` 如何工作,可以考虑其基本原理具体实现细节。 #### 原理概述 `mymalloc` 的核心在于管理分配堆中的连续内存块。通常情况下,该函数会请求操作系统提供一大片未使用的内存区域,并将其划分为更小的部分来满足不同的分配需求[^2]。 当首次调用 `mymalloc` 时,它可能通过系统调用来获取一块较大的原始内存池;之后每次被调用,则从这个预取的大块里切割出合适大小的小片段返回给用户程序使用。如果当前剩余的空间不足以满足新的申请量,则再次向OS索要更多资源扩充自己的可用范围。 #### 数据结构设计 对于内部管理已分配与空闲节点的信息流,一种常见做法是采用链表形式的数据结构: - **Free List**: 记录所有尚未被占用的碎片位置及其长度。 - **Allocated Blocks**: 维护着每一个成功分发出去的对象地址以及它们各自的尺寸信息。 这种机制允许快速查找合适的空白区间并执行分割操作,同时也便于后续回收再利用这些曾经释放过的部分。 #### 关键算法逻辑 以下是简化版的伪代码表示法展示了一个简单的 `mymalloc` 实现方式: ```c #include <stddef.h> #include <string.h> typedef struct Block { size_t size; struct Block* next; } Block; static char heap[HEAP_SIZE]; /* 预先设定好的固定大小 */ static Block head = { HEAP_SIZE, NULL }; void* mymalloc(size_t requestSize) { Block* currentBlock = &head; while (currentBlock != NULL && !(currentBlock->size >= requestSize)) { currentBlock = currentBlock->next; } if (!currentBlock || !requestSize) return NULL; void* allocatedMemoryAddress = ((char*)currentBlock + sizeof(Block)); // 如果找到足够大的区块则进行拆分处理 if(currentBlock->size > requestSize + sizeof(Block)){ Block* newBlock = (Block*)((char*)allocatedMemoryAddress + requestSize); newBlock->size = currentBlock->size - requestSize - sizeof(Block); newBlock->next = currentBlock->next; currentBlock->next = newBlock; currentBlock->size = requestSize; } // 将此block标记为已分配状态(这里简单起见不做额外字段) return allocatedMemoryAddress; } ``` 上述代码展示了如何遍历自由列表寻找适当大小的内存区段,并对其进行必要的调整以适应新来的请求。值得注意的是,在实际应用中还需要加入边界情况判断、错误检测等功能模块确保稳定性。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值