前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >利用结构化异常实现动态分配虚拟内存

利用结构化异常实现动态分配虚拟内存

作者头像
我与梦想有个约会
发布2023-10-21 14:20:49
1240
发布2023-10-21 14:20:49
举报
文章被收录于专栏:jiajia_deng

虚拟内存一次保留(MEM_RESERVE 可以理解为申请)最小就是 64K,一次提交(MEM_COMMIT)至少是一个页面 4K。而往往有的时候我们不知道我们到底需要多少虚拟内存才够使用,所以可能需要动态分配,下面例子演示了如何使用结构化异常机制,动态根据需要分配内存给一个不断写入新字符的空间使用。例子来自 MSDN,我只是学习抄写了一份!

代码语言:javascript
复制
#include <tchar.h>
#include <windows.h>

#define PAGELIMIT 80
LPTSTR lpNxtPage;       // 用于记录已经提交的虚拟内存的位置
DWORD dwPages = 0;      // 限制次数
DWORD dwPageSize;       // 储存系统页面大小的变量

int PageFaultExceptionFilter(DWORD dwCode)
{
    LPVOID lpvResult;
    // 如果进程不是访问了错误的虚拟内存地址,直接返回
    if (dwCode != EXCEPTION_ACCESS_VIOLATION)
    {
        return EXCEPTION_EXECUTE_HANDLER;
    }
    // 如果超出了页面限制,直接返回
    if (dwPages > PAGELIMIT)
    {
        return EXCEPTION_EXECUTE_HANDLER;
    }

    // 为程序分配内存
    lpvResult = VirtualAlloc((LPVOID)lpNxtPage, dwPageSize, MEM_COMMIT, PAGE_READWRITE);
    if (NULL == lpvResult)
    {
        return EXCEPTION_EXECUTE_HANDLER;
    }

    // 限制变量自增
    dwPages++;
    // 让已提交内存位置后移
    lpNxtPage += dwPageSize;

    // 让程序继续执行
    return EXCEPTION_CONTINUE_EXECUTION;
}

void main(void)
{
    LPVOID  lpvBase;
    LPTSTR  lpPtr;
    BOOL    bSuccess;
    DWORD   i;

    SYSTEM_INFO sSysInfo;
    GetSystemInfo(&sSysInfo);
    dwPageSize = sSysInfo.dwPageSize;

    lpvBase = VirtualAlloc(NULL, PAGELIMIT * dwPageSize, MEM_RESERVE, PAGE_NOACCESS);
    lpPtr = lpNxtPage = (LPTSTR)lpvBase;
    for (i = 0; i < PAGELIMIT * dwPageSize; i++)
    {
        __try
        {
            // 尚未分配内存就给赋值会触发异常
            lpPtr[i] = 'a';
        }
        __except (PageFaultExceptionFilter(GetExceptionCode()))
        {
            ExitProcess(GetLastError());
        }
    }
    bSuccess = VirtualFree(lpvBase, 0, MEM_RELEASE);
}

void ErrorExit(LPTSTR lpMsg)
{
    _tprintf(_T("Error! %s with error code of %ld\n"), lpMsg, GetLastError());
    exit(0);
}
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2016-04-04,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档