兔子的技术博客

兔子

   :: 首页 :: 联系 :: 聚合  :: 管理
  202 Posts :: 0 Stories :: 43 Comments :: 0 Trackbacks

留言簿(10)

最新评论

阅读排行榜

评论排行榜

原文:http://www.wangchao.net.cn/bbsdetail_65784.html

  // 文件名: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 *= 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的内存,比较耗内存.
posted on 2009-09-23 09:56 会飞的兔子 阅读(1443) 评论(0)  编辑 收藏 引用 所属分类: C++及开发环境

只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理