https://www.hdzikao.com

内存管理第三讲笔记 malloc/free(一)(#include<alloc.h>)【内存管理第三讲笔记】

[导读] 大家好,今天小热关注到一个比较有意思的话题,就是关于alloc_small的问题,于是小编就整理了2个相关介绍alloc_small的解答,让我们一起看看吧。 文章目录: 内存管理第三讲笔记 malloc/free(一

内存管理第三讲笔记 malloc/free(一)(#include<alloc.h>)【内存管理第三讲笔记】

大家好,今天小热关注到一个比较有意思的话题,就是关于alloc_small的问题,于是小编就整理了2个相关介绍alloc_small的解答,让我们一起看看吧。

文章目录:

  1. 内存管理第三讲笔记 malloc/free(一)
  2. #include<alloc.h>

一、内存管理第三讲笔记 malloc/free(一)

前言

在C语言中,`malloc`与`free`函数作为内存管理的重要工具。`malloc`负责根据所需空间大小调用操作系统API或内部小块内存管理机制,而`free`用于释放内存。操作系统层面的内存管理涉及到独特内存区域的创建和管理,如VC6和VC10中的`SBH`(Small Block Heap)机制。

VC6版本中,`SBH`负责小空间的内存管理,而VC10中这部分功能被整合到了操作系统API中,不再显式存在。

一、VC6与VC10的`malloc`比较

VC6中的`SBH`在VC10中已被整合进`HeapAlloc()`,在不同的编译器版本中,内存管理策略有所调整。

注意:`heap_init`和`ioinit`在VC6与VC10中均存在,但具体实现有所不同。

二、VC6内存分配过程

分析过程从函数调用的顺序开始:

1、`heap_init`初始化内存堆。

`_heap_init(...)`与`__sbh_heap_init()`共同作用,为`SBH`分配特定大小的头部空间,并配置区域,以供应用程序在大小超过预设阈值时使用`HeapAlloc()`。

2、计算并分配实际内存大小。

`_malloc_dbg()`进行`malloc`的调试模式调用,`_heap_alloc_dbg()`调整实际分配的内存大小,并添加调试信息。

`heap_alloc_dbg`调用`_heap_alloc_base()`获取指定大小内存的头部指针,形成链表结构。

`__sbh_alloc_block(...)`为调试器信息包装的数据添加头部和尾部cookie,并调整大小。

`__sbh_alloc_new_region()`开始实际分配内存,并管理内存区域,构建内存管理结构。

三、内存分配与管理

在实际分配内存时,内存被分为`_CrtMemBlockHeader`、`data`和`anotherGap`三个部分,其中`_CrtMemBlockHeader`包含了调试信息和链表指针,以方便内存管理。

`heap_alloc_base()`根据所需调试信息大小计算总内存需求,向上调整至16的倍数。

`__sbh_alloc_new_group()`分配内存,并管理不同大小的内存块,通过`Group`和`ListHead`结构实现内存块的高效管理。

四、内存使用与回收

内存使用时,`ioinit`等函数申请特定大小的内存,根据计算结果选择合适的内存分配策略。内存回收时,通过管理结构确保内存的合理分配和高效利用。

综上所述,`malloc`与`free`通过不同层次的内存管理机制,确保了C语言程序的内存安全与高效使用。

二、#include<alloc.h>

/* alloc.h

memory management functions and variables.

Copyright (c) Borland International 1987,1988

All Rights Reserved.

*/

#if __STDC__ ;标准C

#define _Cdecl ;定义C函数声明

#else

#define _Cdecl cdecl

#endif

#ifndef _STDDEF

#define _STDDEF ;标准定义

#ifndef _PTRDIFF_T

#define _PTRDIFF_T ;指针差

#if defined(__LARGE__) || defined(__HUGE__) || defined(__COMPACT__)

;根据内存模式定义指针类型

;实模式下IA-32有6种程序内存模式

;分别是巨(__HUGE__) ,大(__LARGE__),中(__MEDIUM__)

; 小(__SMALL__),微(__TINY__) ,压缩(__COMPACT__)

;对于__HUGE__,__LARGE__,__MEDIUM__ 定义长指针32位

;这是因为这3种类型数据可以存放在多个段

typedef long ptrdiff_t;

#else

typedef int ptrdiff_t;

;定义成短指针,因为数据存在一个段

#endif

#endif

#ifndef _SIZE_T

#define _SIZE_T ;定义偏移类型,无符号int

typedef unsigned size_t;

#endif

#endif

#ifndef NULL ;定义NULL

#if defined(__TINY__) || defined(__SMALL__) || defined(__MEDIUM__)

#define NULL 0

#else

#define NULL 0L

#endif

#endif

int _Cdecl brk (void *addr);

;扩大程序可用数据范围,具体用法不明

;指针addr之前为进程可用范围

;之后为不可用范围(包括指针所指位置)

void *_Cdecl calloc (size_t nitems, size_t size);

;分配数组空间,nitems为数组元素个数,size为元素大小

#if defined(__COMPACT__) || defined(__LARGE__) || defined(__HUGE__)

unsigned long _Cdecl coreleft (void);

#else ;计算剩余可分配空间,具体用法不明

unsigned _Cdecl coreleft (void);

#endif

void _Cdecl free (void *block);

;释放 malloc 分配的内存

void *_Cdecl malloc (size_t size);

;分配连续内存空间,以八字节对齐,另多分配4个字节

void *_Cdecl realloc (void *block, size_t size);

;重新分配内存

void *_Cdecl sbrk (int incr);

;增加进程可用空间,与brk()相对应

#if !__STDC__ ;以上内存分配函数的32位形式

void far * _Cdecl farcalloc (unsigned long nunits, unsigned long unitsz);

unsigned long _Cdecl farcoreleft(void);

void _Cdecl farfree (void far *block);

void far *_Cdecl farmalloc (unsigned long nbytes);

void far *_Cdecl farrealloc (void far *oldblock, unsigned long nbytes);

#endif



到此,以上就是小编对于alloc_small的问题就介绍到这了,希望介绍关于alloc_small的2点解答对大家有用。

郑重声明:本文版权归原作者所有,转载文章仅为传播更多信息之目的,如作者信息标记有误,请第一时间联系我们修改或删除,多谢。

相关文章阅读