☰
私有内存的申请释放
2026/10/2 7:05:39 网站建设 项目流程

内存类型与查看方法

  1. 调试查看
    ● 工具:WinDbg
    ● 命令:!vad,查看 VAD(虚拟地址描述符)树,查看进程内存区域信息
  2. 两大类虚拟内存
类型标记特点例子
私有内存 PrivateVAD 标记 Private物理页仅当前进程独占,别的进程不能访问栈、堆、普通动态分配内存
映射内存 MappedVAD 标记 Mapped多个进程页表可指向同一份物理页,实现共享DLL 模块、内存映射文件

基础单位:物理页固定 4KB(0x1000)

内存申请的两大底层方式

✅ 只有下面这两种是直接向操作系统内核申请虚拟内存malloc/new/HeapAlloc 属于二次分配

  1. 私有内存:VirtualAlloc / VirtualAllocEx
    ● VirtualAlloc:当前进程申请内存
    ● VirtualAllocEx:传入进程句柄,在别的进程内部申请内存(注入常用)
  2. 共享映射内存:CreateFileMapping
    ● 多个进程可打开同一个映射对象,共享同一份物理页,用于进程间通信

VirtualAlloc 参数详解

LPVOIDVirtualAlloc(LPVOID lpAddress,// 期望起始地址,NULL=系统自动分配SIZE_T dwSize,// 申请字节大小,自动向上按4KB页对齐DWORD flAllocationType,DWORD flProtect);
  1. flAllocationType 分配类型
    ● MEM_RESERVE:仅保留虚拟地址,不分配物理页,不占用物理内存
    ● MEM_COMMIT:提交,建立虚拟地址,可在访问时分配物理页(延迟分配)
    可以组合:MEM_RESERVE | MEM_COMMIT
  2. flProtect 内存保护属性
    ● PAGE_READONLY:只读
    ● PAGE_READWRITE:读写
    ● PAGE_EXECUTE:可执行
    ● PAGE_EXECUTE_READWRITE:读写执行
    VirtualFree 内存释放:
BOOLVirtualFree(LPVOID lpAddress,//起始地址,与申请的相同SIZE_T dwSize,//释放大小,与申请的相同DWORD dwFreeType);

dwFreeType:
● MEM_DECOMMIT:取消提交,释放物理页,保留虚拟地址空间
● MEM_RELEASE:完全释放虚拟地址 + 物理页,此时 dwSize 必须填 0
分配粒度:哪怕只申请 1 字节,系统也分配一整个 4KB 页面
延迟分配:即使使用 MEM_COMMIT,也不会立刻分配物理页,等到代码访问该内存才触发缺页异常分配物理页

堆与栈(上层内存)

  1. 底层本质:栈、堆的大块虚拟地址空间,在程序启动时就已经通过 VirtualAlloc 预先向系统申请完毕
    ● malloc / new 底层调用HeapAlloc
    ● HeapAlloc 不是直接进内核申请内存,只是在已经申请好的大块内存里面切割小块,属于二次分配
  2. 栈与堆对比
栈内存堆内存
用途局部变量,函数临时数据动态不确定大小的数据
管理方式系统自动分配自动释放程序员手动申请、手动释放
地址特点地址连续,地址值偏高地址相对分散
生命周期函数调用自动回收直到调用 free/delete 释放

五、总结
4. 内存两大底层类型:Private 私有内存(VirtualAlloc)、Mapped 映射共享内存(CreateFileMapping)
5. VirtualAlloc:MEM_RESERVE 保留地址;MEM_COMMIT 提交;VirtualFree:两种释放模式
6. 所有分配按 4KB 页对齐,MEM_COMMIT 采用延迟分配物理页
7. malloc/new ≠ 系统底层内存申请,底层是 HeapAlloc,是在 VirtualAlloc 预先申请好的内存块内二次分割
8. 栈、堆都属于私有内存,在进程启动阶段预先申请虚拟地址空间
一句话:VirtualAlloc 是向操作系统批发内存;malloc 只是在批发来的内存里零售小块

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询