WIN API当中的堆管理,虚拟内存及常规复制,移动,填充代码

简介:

代码一个一个的输入,有点累,但也充实。

感觉收获较多。

特别是书中将C标准库的malloc最终调用的是HeapAlloc函数。

而相对于堆内存管理负责的HeapAlloc(GlobalAlloc,LocalAlloc),属于虚拟内存管理范围的VirtualAlloc更底层。

这对理解操作系统实现及以后的软件性能及内存泄漏调度,更有帮助。

Heap.c

复制代码
 1 #include <Windows.h>
 2 #include <stdio.h>
 3 
 4 #define MEM_BLOCK_SIZE 32
 5 
 6 BOOL ShowMemContent(LPVOID, SIZE_T);
 7 int main(void)
 8 {
 9     HANDLE hHeap = GetProcessHeap();
10     LPVOID lpSrc;
11     LPVOID lpDis;
12 
13     lpSrc = HeapAlloc(hHeap, 0, MEM_BLOCK_SIZE);
14     lpDis = HeapAlloc(hHeap, 0, MEM_BLOCK_SIZE);
15 
16     printf("HeapAlloc distribut but not make zero: \n");
17     ShowMemContent(lpDis, MEM_BLOCK_SIZE);
18 
19     ZeroMemory(lpDis, MEM_BLOCK_SIZE);
20     printf("ZeroMemory make zero: \n");
21     ShowMemContent(lpDis,MEM_BLOCK_SIZE);
22 
23     FillMemory(lpSrc, MEM_BLOCK_SIZE, 0xBB);
24     FillMemory(lpSrc, MEM_BLOCK_SIZE/2, 0xAA);
25     CopyMemory(lpDis, lpSrc, MEM_BLOCK_SIZE);
26 
27     printf("FillMemory fill Memory: \n");
28     ShowMemContent(lpDis,MEM_BLOCK_SIZE);
29 
30     HeapFree(hHeap, 0, lpSrc);
31     HeapFree(hHeap, 0, lpDis);
32     return 0;
33 }
34 
35 BOOL ShowMemContent(LPVOID lpMem, SIZE_T dwSize)
36 {
37     BYTE lpShow[MEM_BLOCK_SIZE];
38     INT i;
39 
40     if(dwSize > MEM_BLOCK_SIZE)
41     {
42         printf("over-flow!");
43         return FALSE;
44     }
45 
46     CopyMemory((LPVOID)lpShow, lpMem, dwSize);
47     for(i = 0; i < dwSize; i++)
48     {
49         printf("%.2x",lpShow[i]);
50         if(!((i+1)%16))
51         {
52             printf("\n");
53         }
54     }
55     printf("\n");
56     return TRUE;
57 }
复制代码

Virtual.c

复制代码
 1 #include <Windows.h>
 2 #include <stdio.h>
 3 
 4 int main(void)
 5 {
 6     SIZE_T sizeVirtual = 4000;
 7     LPVOID lpRound = (LPVOID)0x100000FF;
 8     MEMORY_BASIC_INFORMATION mbi;
 9 
10     LPVOID lpAddress = VirtualAlloc(
11         lpRound, sizeVirtual,
12         MEM_COMMIT|MEM_RESERVE, PAGE_READWRITE

13         );
14     if(lpAddress == NULL)
15     {
16         printf("VirtualAlloc error: %d\n",GetLastError());
17         return 1;
18     }
19     printf("Alloc:MEM_COMMIT|MEM_RESERVE\n");
20     CopyMemory(lpAddress, "Hello", lstrlen("Hello"));
21     printf("Alloction,Copy sucess.address: 0x%.8x, content: %s\n",lpAddress, lpAddress);
22     VirtualQuery(lpAddress, &mbi, sizeof(mbi));
23     printf("Information from VirtualQuery: \n"
24         "BaseAddress:0x%.8x\tAllocationBase:0x%.8x\t"
25         "AllocationProtect:0x%.8x\tRegionSize:%u\t"
26         "State:0x%.8x\tProtect:0x%.8x\tType:0x%.8x\n",
27         mbi.BaseAddress,mbi.AllocationBase,
28         mbi.AllocationProtect,mbi.RegionSize,
29         mbi.State,mbi.Protect,mbi.Type
30         );
31     
32     printf("Free: DECOMMIT\n");
33     if(!VirtualFree(lpRound, sizeVirtual, MEM_DECOMMIT))
34     {
35         printf("VirtualFree error: %d",GetLastError());
36         return 1;
37     }
38 
39     VirtualQuery(lpAddress, &mbi, sizeof(mbi));
40     printf("Information from VirtualQuery: \n"
41         "BaseAddress:0x%.8x\tAllocationBase:0x%.8x\t"
42         "AllocationProtect:0x%.8x\tRegionSize:%u\t"
43         "State:0x%.8x\tProtect:0x%.8x\tType:0x%.8x\n",
44         mbi.BaseAddress,mbi.AllocationBase,
45         mbi.AllocationProtect,mbi.RegionSize,
46         mbi.State,mbi.Protect,mbi.Type
47         );
48     
49     printf("Free:RELEASE\n");
50     if(!VirtualFree(lpAddress, 0, MEM_RELEASE))
51     {
52         printf("VirtualFree error: %d",GetLastError());
53         return 1;
54     }
55     return 0;
56 }
复制代码

MemOp.c

复制代码
 1 #include <Windows.h>
 2 #include <stdio.h>
 3 
 4 #define MEM_BLOCK_SIZE 32
 5 
 6 BOOL ShowMemContent(LPVOID, SIZE_T);
 7 int main(void)
 8 {
 9     HANDLE hHeap = GetProcessHeap();
10     LPVOID lpSrc;
11     LPVOID lpDis;
12 
13     lpSrc = HeapAlloc(hHeap, 0, MEM_BLOCK_SIZE);
14     lpDis = HeapAlloc(hHeap, 0, MEM_BLOCK_SIZE);
15 
16     printf("HeapAlloc distribut but not make zero: \n");
17     ShowMemContent(lpDis, MEM_BLOCK_SIZE);
18 
19     ZeroMemory(lpDis, MEM_BLOCK_SIZE);
20     printf("ZeroMemory make zero: \n");
21     ShowMemContent(lpDis,MEM_BLOCK_SIZE);
22 
23     FillMemory(lpSrc, MEM_BLOCK_SIZE, 0xBB);
24     FillMemory(lpSrc, MEM_BLOCK_SIZE/2, 0xAA);
25     CopyMemory(lpDis, lpSrc, MEM_BLOCK_SIZE);
26 
27     printf("FillMemory fill Memory: \n");
28     ShowMemContent(lpDis,MEM_BLOCK_SIZE);
29 
30     HeapFree(hHeap, 0, lpSrc);
31     HeapFree(hHeap, 0, lpDis);
32     return 0;
33 }
34 
35 BOOL ShowMemContent(LPVOID lpMem, SIZE_T dwSize)
36 {
37     BYTE lpShow[MEM_BLOCK_SIZE];
38     INT i;
39 
40     if(dwSize > MEM_BLOCK_SIZE)
41     {
42         printf("over-flow!");
43         return FALSE;
44     }
45 
46     CopyMemory((LPVOID)lpShow, lpMem, dwSize);
47     for(i = 0; i < dwSize; i++)
48     {
49         printf("%.2x",lpShow[i]);
50         if(!((i+1)%16))
51         {
52             printf("\n");
53         }
54     }
55     printf("\n");
56     return TRUE;
57 }
复制代码

运行图:

目录
相关文章
|
2月前
|
缓存 Prometheus 监控
Elasticsearch集群JVM调优设置合适的堆内存大小
Elasticsearch集群JVM调优设置合适的堆内存大小
323 1
|
2天前
|
JavaScript API C#
【Azure Developer】Python代码调用Graph API将外部用户添加到组,结果无效,也无错误信息
根据Graph API文档,在单个请求中将多个成员添加到组时,Python代码示例中的`members@odata.bind`被错误写为`members@odata_bind`,导致用户未成功添加。
21 10
|
9天前
|
算法 Java
堆内存分配策略解密
本文深入探讨了Java虚拟机中堆内存的分配策略,包括新生代(Eden区和Survivor区)与老年代的分配机制。新生代对象优先分配在Eden区,当空间不足时执行Minor GC并将存活对象移至Survivor区;老年代则用于存放长期存活或大对象,避免频繁内存拷贝。通过动态对象年龄判定优化晋升策略,并介绍Full GC触发条件。理解这些策略有助于提高程序性能和稳定性。
|
18天前
|
JSON API 数据安全/隐私保护
淘宝评论API接口操作步骤详解,代码示例参考
淘宝评论API接口是淘宝开放平台提供的一项服务,通过该接口,开发者可以访问商品的用户评价和评论。这些评论通常包括评分、文字描述、图片或视频等内容。商家可以利用这些信息更好地了解消费者的需求和偏好,优化产品和服务。同时,消费者也可以从这些评论中获得准确的购买参考,做出更明智的购买决策。
|
29天前
|
API Python
【Azure Developer】分享一段Python代码调用Graph API创建用户的示例
分享一段Python代码调用Graph API创建用户的示例
50 11
|
1月前
|
存储 算法 Java
Java 内存管理与优化:掌控堆与栈,雕琢高效代码
Java内存管理与优化是提升程序性能的关键。掌握堆与栈的运作机制,学习如何有效管理内存资源,雕琢出更加高效的代码,是每个Java开发者必备的技能。
55 5
|
2月前
|
API
全国行政区划代码与经纬度查询免费API接口教程
该接口提供全国各行政区划代码及经纬度查询服务。通过POST或GET请求,输入用户ID、KEY及地点名称,可获取地区代码、省份、市级、区县级名称及经纬度等信息。示例URL:https://cn.apihz.cn/api/other/xzqhdm.php?id=88888888&key=88888888&sheng=北京&place=北京。返回数据包含状态码、信息提示及查询结果。
190 14
|
2月前
|
并行计算 算法 测试技术
C语言因高效灵活被广泛应用于软件开发。本文探讨了优化C语言程序性能的策略,涵盖算法优化、代码结构优化、内存管理优化、编译器优化、数据结构优化、并行计算优化及性能测试与分析七个方面
C语言因高效灵活被广泛应用于软件开发。本文探讨了优化C语言程序性能的策略,涵盖算法优化、代码结构优化、内存管理优化、编译器优化、数据结构优化、并行计算优化及性能测试与分析七个方面,旨在通过综合策略提升程序性能,满足实际需求。
63 1
|
3月前
|
缓存 算法 Java
JVM知识体系学习六:JVM垃圾是什么、GC常用垃圾清除算法、堆内存逻辑分区、栈上分配、对象何时进入老年代、有关老年代新生代的两个问题、常见的垃圾回收器、CMS
这篇文章详细介绍了Java虚拟机(JVM)中的垃圾回收机制,包括垃圾的定义、垃圾回收算法、堆内存的逻辑分区、对象的内存分配和回收过程,以及不同垃圾回收器的工作原理和参数设置。
97 4
JVM知识体系学习六:JVM垃圾是什么、GC常用垃圾清除算法、堆内存逻辑分区、栈上分配、对象何时进入老年代、有关老年代新生代的两个问题、常见的垃圾回收器、CMS
|
3月前
|
人工智能 机器人 API
【通义】AI视界|谷歌Q3财报:Gemini API六个月增长14倍,公司超25%的新代码由AI生成
本文内容由通义自动生成,涵盖谷歌Q3财报、马斯克xAI融资、九巨头联盟挑战英伟达、Meta加大AI投入及麻省理工研究LLM与人脑相似性等热点资讯。更多精彩内容,请访问通通知道。