windows C++ 虚拟内存的按需调拨

虚拟内存的按需调拨

windows C++ 虚拟内存的按需调拨

文章目录


虚拟内存的按需调拨

cpp 复制代码
/*------------------------------------------------------------------------
 24-SEHAndMemory.cpp
	 
	演示虚拟内存的按需调拨
 
-----------------------------------------------------------------------*/
#include <windows.h>
#include <tchar.h>
#include <locale.h>

#define PAGELIMIT 80
LPBYTE lpNxtPage;
DWORD dwPages = 0;
DWORD dwPageSize;//页面大小,一般为4KB

INT PageFualtExceptionFilter(DWORD dwCode) {
	LPVOID lpvResult;

	//不是非法访问内存
	if (dwCode != EXCEPTION_ACCESS_VIOLATION) {//线程试图读写一个虚拟内存地址,但在这个地址它并不具备相应权限
		return EXCEPTION_EXECUTE_HANDLER;//执行except块的异常处理程序代码
	}

	//当超过指定的页面数时
	if (dwPages >= PAGELIMIT) {
		return EXCEPTION_EXECUTE_HANDLER;//执行except块的异常处理程序代码
	}

	//非法访问内存,则为预订的空间提交下一页物理存储器
	lpvResult = VirtualAlloc((LPVOID)lpNxtPage, dwPageSize, MEM_COMMIT, PAGE_READWRITE);
	if (lpvResult == NULL) {
		return EXCEPTION_EXECUTE_HANDLER;//执行except块的异常处理程序代码
	}

	//提交成功
	dwPages++;
	lpNxtPage += dwPageSize;

	_tprintf(_T("第%d页提交成功!\n"), dwPages);
	return EXCEPTION_CONTINUE_EXECUTION; //重新执行触发异常的那条CPU指令
}

int main() {
	_tsetlocale(LC_ALL, _T("chs"));

	LPVOID lpvBase; LPTSTR lpPtr; BOOL bSuccess;
	SYSTEM_INFO sSysInfo;
	GetSystemInfo(&sSysInfo);
	dwPageSize = sSysInfo.dwPageSize;

	_tprintf(_T("CPU页面大小为%dKB.\n"), sSysInfo.dwPageSize / 1024);

	//预订存储器
	lpvBase = VirtualAlloc(NULL, PAGELIMIT*dwPageSize, MEM_RESERVE, PAGE_NOACCESS);

	lpPtr = (LPTSTR)(lpNxtPage = (LPBYTE)lpvBase);
	for (DWORD i = 0; i < PAGELIMIT*dwPageSize / sizeof(TCHAR); i++) {
		__try {
			lpPtr[i] = _T('a');//写入一个字节的数据
		}
		__except (PageFualtExceptionFilter(GetExceptionCode())) {

			_tprintf(_T("异常被处理\n"));
			//ExitProcess(GetLastError());
		}
	}

	bSuccess = VirtualFree(lpvBase, 0, MEM_RELEASE);
	_tprintf(_T("释放操作%s.\n"), bSuccess ? _T("成功") : _T("失败"));
	_tsystem(_T("PAUSE"));
	return 0;
}
相关推荐
ZouZou老师1 小时前
C++设计模式之工厂方法模式:以家具生产为例
c++·设计模式·工厂方法模式
fish_xk4 小时前
c++中的引用和数组
开发语言·c++
有点。7 小时前
C++ ⼀级 2024 年 03 ⽉
c++
酒尘&7 小时前
JS数组不止Array!索引集合类全面解析
开发语言·前端·javascript·学习·js
冬夜戏雪7 小时前
【java学习日记】【2025.12.7】【7/60】
java·开发语言·学习
xwill*7 小时前
分词器(Tokenizer)-sentencepiece(把训练语料中的字符自动组合成一个最优的子词(subword)集合。)
开发语言·pytorch·python
CC.GG7 小时前
【C++】二叉搜索树
java·c++·redis
咖啡の猫8 小时前
Python列表的查询操作
开发语言·python
Savior`L8 小时前
二分算法及常见用法
数据结构·c++·算法
深海潜水员8 小时前
OpenGL 学习笔记 第一章:绘制一个窗口
c++·笔记·学习·图形渲染·opengl