我在看windows API 方面的书,看到内存管理API这部分时,遇到了这些函数。
这些函数查MSDN都能查到,但是,很不理解,堆分配内存和虚拟内存分配内存的区别是什么,这两者的区别是什么。
1.分配虚拟内存
LPVOID WINAPI VirtualAlloc(
__in LPVOID lpAddress,
__in SIZE_T dwSize,
__in DWORD flAllocationType,
__in DWORD flProtect
);
2.释放虚拟内存
BOOL WINAPI VirtualFree(
__in LPVOID lpAddress,
__in SIZE_T dwSize,
__in DWORD dwFreeType
);
3.修改虚拟内存页属性
BOOL WINAPI VirtualProtect(
__in LPVOID lpAddress,
__in SIZE_T dwSize,
__in DWORD flNewProtect,
__out PDWORD lpflOldProtect
);
1. 为堆分配内存
LPVOID WINAPI HeapAlloc(
__in HANDLE hHeap,
__in DWORD dwFlags,
__in SIZE_T dwBytes
);
2.为堆重新分配内存
LPVOID WINAPI HeapReAlloc(
__in HANDLE hHeap,
__in DWORD dwFlags,
__in LPVOID lpMem,
__in SIZE_T dwBytes
);2.为堆释放内存
BOOL WINAPI HeapFree(
__in HANDLE hHeap,
__in DWORD dwFlags,
__in LPVOID lpMem
);
这些函数查MSDN都能查到,但是,很不理解,堆分配内存和虚拟内存分配内存的区别是什么,这两者的区别是什么。
1.分配虚拟内存
LPVOID WINAPI VirtualAlloc(
__in LPVOID lpAddress,
__in SIZE_T dwSize,
__in DWORD flAllocationType,
__in DWORD flProtect
);
2.释放虚拟内存
BOOL WINAPI VirtualFree(
__in LPVOID lpAddress,
__in SIZE_T dwSize,
__in DWORD dwFreeType
);
3.修改虚拟内存页属性
BOOL WINAPI VirtualProtect(
__in LPVOID lpAddress,
__in SIZE_T dwSize,
__in DWORD flNewProtect,
__out PDWORD lpflOldProtect
);
1. 为堆分配内存
LPVOID WINAPI HeapAlloc(
__in HANDLE hHeap,
__in DWORD dwFlags,
__in SIZE_T dwBytes
);
2.为堆重新分配内存
LPVOID WINAPI HeapReAlloc(
__in HANDLE hHeap,
__in DWORD dwFlags,
__in LPVOID lpMem,
__in SIZE_T dwBytes
);2.为堆释放内存
BOOL WINAPI HeapFree(
__in HANDLE hHeap,
__in DWORD dwFlags,
__in LPVOID lpMem
);
解决方案 »
- MFC中IDispatch delete this 时程序中断
- 各位大哥能不能给点学习视频下载网站
- 用timeSetEvent定时器写一个隐藏对话框//对话框隐藏的时候,控件闪咋办呢???
- 请教一个关于内存泄漏的问题。
- 如何实时取得usb摄像头采集的每一帧图像,并对其进行评价
- 请问大家一般用什么软件管理自己的源代码啊
- 请问VC比DELPHI,谁更底层一点?
- 急,为什么我在SOCK服务器端截获不到CAsyncSocket::OnClose(nErrorCode)???在客户端是可以的。谢谢大家!
- HDC 和CDC 类型有什么区别?
- 想兼职的兄弟看过来
- vc++2010 ReadProcessMemory读取基址+多级偏移内存内容问题
- 添加web引用,为什么是灰色的,急。。。。
上面是从内存的用途来分。程序运行时,可用内存=物理内存+虚拟内存。虚拟内存一般用文件来保存数据,虚拟内存的出现主要是因为以前内存不够(16M的内存刚出来的时候可是天价啊),磁盘相对便宜一些,所以聪明的系统设计者就把设计了虚拟内存,在程序运行的时候把那些很久没有被访问过的(可能以后也不会用到)内存映射到文件里面去(以后需要的时候再读进内存),把内存腾出来给真正需要执行的代码和数据,这样看起来可用内存就比物理内存多了。
上面是从内存的组成来说的。
空间中,实际是不存在的,在程序运行时,操作系统会把你在进程分配的空间通过一种映射关系映射到实际的内存中,这一步我们是看不到的,由操作系统完成。数据最终在实际的内存中运算。
HeapAlloc()是堆分配内存函数,查看c,c++的malloc,new函数的代码,可以看到就是对HeapAlloc()函数的封装,在堆上可以动态分配内存。
详见《Windows 核心编程》上面说的很清楚