Skip to content

Instantly share code, notes, and snippets.

@igaozp
Created November 18, 2017 04:51
Show Gist options
  • Select an option

  • Save igaozp/d13f01af65919e0566156c1570ae243c to your computer and use it in GitHub Desktop.

Select an option

Save igaozp/d13f01af65919e0566156c1570ae243c to your computer and use it in GitHub Desktop.
虚拟内存分配
#include <windows.h>
#include <iostream>
void FillZero(LPVOID pBlock, DWORD dwSize)
{
_try
{
BYTE* arFill = (BYTE *)pBlock;
for (DWORD dwFill = 0; dwFill < dwSize; ++dwFill)
{
arFill[dwFill] = 0;
}
std::cout << "Memory zeroed." << std::endl;
}
_except(EXCEPTION_EXECUTE_HANDLER)
{
std::cout << "Could not zero memory. " << std::endl;
}
}
int main(int argc, char* argv[])
{
LPVOID pBlock;
// 1G大小
DWORD c_dwGigabyte = 1 << 30;
// 1M大小
DWORD c_dwMegabyte = 1 << 20;
// 以下运行4种内存分配方式,分别调用FillZero(),
// 相当于使用这些内存,测试内存操作是否成功。
// 分配方式1
pBlock = ::malloc(c_dwGigabyte);
::FillZero(pBlock, c_dwMegabyte);
::free(pBlock);
// 分配方式2
pBlock = ::VirtualAlloc(
NULL, // 不指定起始地址
c_dwGigabyte, // 要求1GB
MEM_COMMIT, // 对应的交换文件页(磁盘)和所要求的页表被留出来,然而,仍然没有物理RAM被分配,
// 只有当程序访问这部分内存时RAM内存才会被真正分配。
PAGE_READWRITE); // 对此的读写操作
::FillZero(pBlock, c_dwMegabyte);
::VirtualFree(pBlock, 0, MEM_RELEASE);
// 分配方式3
pBlock = ::VirtualAlloc(
NULL, // 不指定起始地址
c_dwGigabyte, // 要求1GB
MEM_RESERVE, // 不调配外存
PAGE_READWRITE); // 对此的读写操作
::FillZero(pBlock, c_dwMegabyte);
::VirtualFree(pBlock, 0, MEM_RELEASE);
// 分配方式4
pBlock = ::VirtualAlloc(
NULL, // 不指定起始地址
c_dwGigabyte, // 要求1GB
MEM_RESERVE, // 不调配外存
PAGE_READWRITE); // 对此的读写操作
// 给虚拟空间调配外存。
::VirtualAlloc(
pBlock,
c_dwMegabyte,
MEM_COMMIT, // 对应的交换文件页(磁盘)和所要求的页表被留出来,然而,仍然没有物理RAM被分配,
// 只有当程序访问这部分内存时RAM内存才会被真正分配。
PAGE_READWRITE);
::FillZero(pBlock, c_dwMegabyte);
::VirtualFree(pBlock, 0, MEM_RELEASE);
return 0;
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment