一段网友写的检测内存越界访问的代码

一段网友写的检测内存越界访问的代码
原文: http://www.wangchao.net.cn/bbsdetail_65784.html

   //  文件名:memcheck.h
  
//  作者 : Moonwell
  
//  msn : [email protected]
  
//  在需要检测内存越界的地方加上#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的内存,比较耗内存.

你可能感兴趣的:(一段网友写的检测内存越界访问的代码)