WinApi学习笔记-分配和释放虚拟内存

简介: Code#include #include #include using namespace std;int main(void){    SIZE_T sizeVirtual = 4000;//大小    LPVOID lpRound = (LPVOID)0x100000FF;//地址    M...
img_1c53668bcee393edac0d7b3b3daff1ae.gif img_405b18b4b6584ae338e0f6ecaf736533.gif Code
#include <windows.h>
#include 
<stdio.h>
#include 
<iostream>

using namespace std;

int main(void)
{
    SIZE_T sizeVirtual 
= 4000;//大小
    LPVOID lpRound = (LPVOID)0x100000FF;//地址
    MEMORY_BASIC_INFORMATION mbi;//内存信息

    
//分配内存
    
//MEM_COMMIT|MEM_RESERVE直接把内存从空闲状态变为已提交的状态
    
//PAGE_READWRITE 内存的保护属性
    LPVOID lpAddress = VirtualAlloc(lpRound,sizeVirtual,MEM_COMMIT|MEM_RESERVE,PAGE_READWRITE);

    
if(lpAddress == NULL)
    {
        std::cout
<<"error"<<GetLastError()<<std::endl;
        
return 1;
    }

    std::cout
<<"alloc:MEM_COMMIT|MEM_RESERVE"<<std::endl;

    CopyMemory(lpAddress,
"hello Memmory",lstrlen("hello Memmory"));

    std::cout
<<"分配  复制成功"<<std::endl<<"地址:0x"<<lpAddress<<std::endl;
    std::cout
<<"内容:"<<(LPSTR)lpAddress<<std::endl;

    
//获取内存信息
    VirtualQuery(lpAddress,&mbi,sizeof(mbi));
    cout
<<"VirtualQuery获取信息"<<endl;
    cout
<<"基地址:0x"<<mbi.BaseAddress<<endl;
    cout
<<"内存的保护属性"<<mbi.AllocationProtect<<endl;
    cout
<<"内存状态:0x"<<mbi.State<<endl;

    VirtualFree(lpRound,sizeVirtual,MEM_DECOMMIT);
    cout
<<"内存以decommit释放"<<endl<<"再次查看内存信息:"<<endl;

        
//获取内存信息
    VirtualQuery(lpAddress,&mbi,sizeof(mbi));
    cout
<<"VirtualQuery获取信息"<<endl;
    cout
<<"基地址:0x"<<mbi.BaseAddress<<endl;
    cout
<<"内存的保护属性"<<mbi.AllocationProtect<<endl;
    cout
<<"内存状态:0x"<<mbi.State<<endl;

    VirtualFree(lpAddress,
0,MEM_RELEASE);
    cout
<<"内存被释放"<<endl<<"再次查看内存信息:"<<endl;

        
//获取内存信息
    VirtualQuery(lpAddress,&mbi,sizeof(mbi));
    cout
<<"VirtualQuery获取信息"<<endl;
    cout
<<"基地址:0x"<<mbi.BaseAddress<<endl;
    cout
<<"内存的保护属性"<<mbi.AllocationProtect<<endl;
    cout
<<"内存状态:0x"<<mbi.State<<endl;

    CHAR a;
    std::cin
>>a;

}
目录
相关文章
|
24天前
|
缓存 算法 Java
JVM知识体系学习六:JVM垃圾是什么、GC常用垃圾清除算法、堆内存逻辑分区、栈上分配、对象何时进入老年代、有关老年代新生代的两个问题、常见的垃圾回收器、CMS
这篇文章详细介绍了Java虚拟机(JVM)中的垃圾回收机制,包括垃圾的定义、垃圾回收算法、堆内存的逻辑分区、对象的内存分配和回收过程,以及不同垃圾回收器的工作原理和参数设置。
48 4
JVM知识体系学习六:JVM垃圾是什么、GC常用垃圾清除算法、堆内存逻辑分区、栈上分配、对象何时进入老年代、有关老年代新生代的两个问题、常见的垃圾回收器、CMS
|
24天前
|
存储 Java
JVM知识体系学习四:排序规范(happens-before原则)、对象创建过程、对象的内存中存储布局、对象的大小、对象头内容、对象如何定位、对象如何分配
这篇文章详细地介绍了Java对象的创建过程、内存布局、对象头的MarkWord、对象的定位方式以及对象的分配策略,并深入探讨了happens-before原则以确保多线程环境下的正确同步。
46 0
JVM知识体系学习四:排序规范(happens-before原则)、对象创建过程、对象的内存中存储布局、对象的大小、对象头内容、对象如何定位、对象如何分配
|
3月前
|
关系型数据库 MySQL
MySQl优化:使用 jemalloc 分配内存
MySQl优化:使用 jemalloc 分配内存
|
3月前
|
缓存 Java 编译器
Go 中的内存布局和分配原理
Go 中的内存布局和分配原理
|
4月前
|
存储 缓存 算法
(五)JVM成神路之对象内存布局、分配过程、从生至死历程、强弱软虚引用全面剖析
在上篇文章中曾详细谈到了JVM的内存区域,其中也曾提及了:Java程序运行过程中,绝大部分创建的对象都会被分配在堆空间内。而本篇文章则会站在对象实例的角度,阐述一个Java对象从生到死的历程、Java对象在内存中的布局以及对象引用类型。
119 8
|
3月前
|
存储 程序员 编译器
c++学习笔记08 内存分区、new和delete的用法
C++内存管理的学习笔记08,介绍了内存分区的概念,包括代码区、全局区、堆区和栈区,以及如何在堆区使用`new`和`delete`进行内存分配和释放。
45 0
|
4月前
|
NoSQL Redis C++
c++开发redis module问题之在复杂的Redis模块中,特别是使用第三方库或C++开发时,接管内存统计有哪些困难
c++开发redis module问题之在复杂的Redis模块中,特别是使用第三方库或C++开发时,接管内存统计有哪些困难
|
4月前
|
Java 运维
开发与运维内存问题之在堆内存中新创建的对象通常首先分配如何解决
开发与运维内存问题之在堆内存中新创建的对象通常首先分配如何解决
21 1
|
3月前
|
存储 NoSQL Java
Tair的发展问题之Tair对于不同存储介质(如内存和磁盘)的线程分配是如何处理的
Tair的发展问题之Tair对于不同存储介质(如内存和磁盘)的线程分配是如何处理的
|
5月前
|
存储 编译器 C语言
【C++】学习笔记——内存管理
【C++】学习笔记——内存管理
52 15