闲着无事,写了一个检测内存越界访问的工具(windows平台)

王朝system·作者佚名  2006-01-09
宽屏版  字体: |||超大  

// 文件名: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的内存,比较耗内存.

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
© 2005- 王朝网络 版权所有