中国IT动力,最新最全的IT技术教程
最新100篇 | 推荐100篇 | 专题100篇 | 排行榜 | 搜索 | 在线API文档 | 网通镜像
首 页 | 程序开发 | 操作系统 | 软件应用 | 图形图象 | 网络应用 | 精文荟萃 | 教育认证 | 硬件维护 | 未整理篇 | 站长教程
ASP JS PHP工程 ASP.NET 网站建设 UML J2EESUN .NET VC VB VFP 网络维护 数据库 DB2 SQL2000 Oracle Mysql
服务器 Win2000 Office C DreamWeaver FireWorks Flash PhotoShop 上网宝典 CorelDraw 协议大全 网络安全 微软认证
硬件维护  CPU  主板  硬盘  内存  显卡  显示器  键盘鼠标  声卡音箱  打印机  机箱电源  BIOS  网卡  C#  Java  Delphi  vs.net2005
  当前位置:> 程序开发 > 编程语言 > 综合其它
闲着无事,写了一个检测内存越界访问的工具(windows平台)
作者:未知 时间:2005-07-27 23:19 出处:CSDN 责编:chinaitpower
              摘要:闲着无事,写了一个检测内存越界访问的工具(windows平台)
// 文件名:memcheck.h
// 作者 : Moonwell
// msn : archonzhao@hotmail.com
// 在需要检测内存越界的地方加上#include "memcheck.h"
// 程序运行过程中,出现内存越界访问的代码将会出现中断

#ifndef _MEM_CHECK_H
#define _MEM_CHECK_H

void * operator new (size_t size)
{
//创建的页面个数
int page_num = (int) ( size / 4096 + 1 );

//偏移量
size_t offset = page_num * 4096 - size;

//在内存块的后面创建一个额外的保护页面,并且将页面的属性设置为不可读写
void *p = VirtualAlloc(NULL,page_num*4096+1,MEM_COMMIT,PAGE_EXECUTE_READWRITE);

//定位最后一个保护页面的地址
void *pchecker = (char *)p + page_num*4096;

//设置最后一页为不可读写
DWORD old_value;
VirtualProtect(pchecker,4096,PAGE_NOACCESS,&old_value);

return (char *)p + offset;
}
 
void operator delete (void *p)
{
//找到VirtualAlloc时候的起始地址
p = (char *)p - (size_t)p % 4096;

VirtualFree(p,0,MEM_RELEASE);
}

#endif


//总共没有几行代码,使用举例如下:

#include <windows.h>
#include "memcheck.h"

int main(int argc,char *argv[])
{
       char * a = new char[12340];
       printf("%c",a[12340]); //程序运行到这里将出现debug中断

       delete [] a;
       return 0;
}


注意:每次new操作,至少会创建比原来多4k的内存,比较耗内存.


关闭本页
 
首页 | 投资与合作 | 服务条款 | 隐私政策 | 收藏本站 | 设为首页 | 新用户注册 | 免责声明 | 使用帮助
Copyright ©2005-2008 chinaitpower.com All rights reserved. www.chinaitpower.com 版权所有