内存管理
- 内存管理—堆
- Windows是如何管理内存数据的?
- 堆内存管理相关API
内存管理—堆
每个进程都有自己独立的4G内存空间,高2G操作系统内核使用,低 2G用户使用。
每个进程中我们使用的都是虚拟地址
,虚拟机地址到物理地址的转换由操作系统内核完成,故而我们无法在自己的进程当中访问其他进程的内存。
对于不同进程windows尽量保证同一份数据,在物理内存中只有一份﹐分别映射到多个进程中,达到节约内存的目的。
当各个进程所使用的内存数量超出物理内存大小后,操作系统还能够将物理内存中暂时用不到的数据交换到硬盘中。
Windows是如何管理内存数据的?
Windows提供了以下3种方式来管理内存数据:
- 堆:适合用来管理大量的小型对象,使用堆管理方式可以非常方便的帮我们管理所需要的内存空间,缺点是效率低,控制不够灵活。
- 虚拟内存:适合用于管理大型的对象数组或大型的结构数组,使用虚拟内存管理方式有丰富的内存管理接口,可以使我们更加精确的控制内存数据。
- 文件映射:适合用于管理大型的数据流,以及在同一个机器上的不同进程间共享数据
堆在 windows中是作为一个对象来管理的,我们可以创建一个堆对象,之后在堆上分配内存,销毁内存等,c/C++中的new malloc其实也是使用的 windows 中的堆对象来分配空间的。
当windows系统创建一个进程后,会为此进程创建一个默认的堆,这个默认堆是不能够被销毁的。l
堆内存管理相关API
#include<Windows.h>
#include<iostream>
int main()
{
//1、创建一个堆对象
HANDLE hHeap = HeapCreate(0, 0, 0);
//2、申请堆内存
char*str = (char*)HeapAlloc(hHeap, HEAP_ZERO_MEMORY, 10);
strcpy_s(str, 10, "helloword");
printf("%s\n", str);
HeapFree(hHeap,0,str);
HeapDestroy(hHeap);
return 0;
}