C语言,如何实现搜索内存数据

C语言,如何实现搜索内存数据,第1张

一般的讲,内存里边虽然说有*G的空间,但有些地方只是挂名存在,实际上是不存在的,所以访问了就会出错,所以就要判断内存是不是为有效地址,

就要用到VirtualQuery获取指定内存属性, 根据属性来判断能不能进行读取,

如果能读取就从调用VirtualQuery中得到的内存信息minfo中获取当前内存地址的有效区域的大小,然后再进行读取. 你可以用VC调试来看看,不能访问的内存就用?号来表示.由于搜所内存是一种运算量庞大的工作,所以,在对比处理要作速度优化处理. 如果数据大于4字节,请用 long 的数据格式来作对比运算, long 是 char 的处理速度的三倍以上,(个人测试的) 用long处理前端数据,再用 char 作收尾工作. 这是对比处理了.流程就有以下:

判断地址的有效性->定好搜所范围->进行对比->输出结果.

StartAdd 开始地址

EndAdd 结束地址

Data 查找的数据

DataSize 数据大小

void *FindMemory(DWORD StartAdd,DWORD EndAdd,void *Data,DWORD DataSize)

{

MEMORY_BASIC_INFORMATION minfo

DWORD rt

while(StartAdd<EndAdd)

{

::VirtualQuery((void*)StartAdd,&minfo,sizeof(MEMORY_BASIC_INFORMATION))

if(minfo.AllocationProtect)

if(minfo.State==MEM_COMMIT||minfo.State==MEM_FREE)

{

char *s=(char*)StartAdd,*e=s+minfo.RegionSize

for(s<e&&s+DataSize<=es++)

if(memcmp(s,Data,DataSize)==0)

return s

}

StartAdd=(DWORD)minfo.BaseAddress+minfo.RegionSize

}

return 0

}

原理就是先申请一大块内存,按照不同尺寸分成很多固定块. 比如16字节100块儿,32字节100块儿.64字节50块儿,具体多少块儿要看你的项目需求,我这里只是举例,反正应用时保证够就行.

然后程序运行时,不再用malloc和new来申请内存. 而是从这些块儿里申请.如果一个结构体A它的尺寸是30字节. 那么就从内存池里申请一块儿32字节的给他.

当然释放时,也要归还给内存池.

内存池负责管理一个Free-Block链表.


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/sjk/6771612.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-03-28
下一篇 2023-03-28

发表评论

登录后才能评论

评论列表(0条)

保存