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;
}
相关推荐
love530love10 小时前
【笔记】AutoClaw NSIS 安装器卡死、进程杀不掉、目录删不了?我是这么解决的
人工智能·windows·笔记·agent
人间凡尔赛10 小时前
Next.js 16 生产级实战:Cache Components + View Transitions 完整指南
开发语言·javascript·ecmascript
selfsongs12 小时前
指针、内存管理、现代 C++ 特性
c++
吃着火锅x唱着歌13 小时前
Effective C++ 学习笔记 条款37 绝不重新定义继承而来的缺省参数值
c++·笔记·学习
2401_8414956413 小时前
【数据结构】B+树
数据结构·数据库·c++·b+树·概念·结构·操作原理
小保CPP13 小时前
OCR C++ Tesseract按行识别字符
c++·人工智能·ocr·模式识别·光学字符识别
稚南城才子,乌衣巷风流14 小时前
函数:编程中的核心概念
开发语言·前端·javascript
阿米亚波14 小时前
【C++】流式数据输入处理(不完全整理)
开发语言·c++·笔记
大模型码小白14 小时前
JAVA 集合框架进阶:List 与 Set 的深度解析与实战
java·开发语言·人工智能·windows·语言模型·list·ai编程
皓月斯语15 小时前
【C++基础】三目运算符
开发语言·数据结构·c++