原文:http://www.wangchao.net.cn/bbsdetail_65784.html
// 文件名:memcheck.h
// 作者 : Moonwell
// msn : archonzhao@hotmail.com
// 在需要檢測(cè)內(nèi)存越界的地方加上#include "memcheck.h"
// 程序運(yùn)行過(guò)程中,出現(xiàn)內(nèi)存越界訪問(wèn)的代碼將會(huì)出現(xiàn)中斷#ifndef _MEM_CHECK_H
#define _MEM_CHECK_H
void * operator new (size_t size)
{
//創(chuàng)建的頁(yè)面?zhèn)€數(shù)
int page_num = (int) ( size / 4096 + 1 );
//偏移量
size_t offset = page_num * 4096 - size;
//在內(nèi)存塊的后面創(chuàng)建一個(gè)額外的保護(hù)頁(yè)面,并且將頁(yè)面的屬性設(shè)置為不可讀寫
void *p = VirtualAlloc(NULL,page_num*4096+1,MEM_COMMIT,PAGE_EXECUTE_READWRITE);
//定位最后一個(gè)保護(hù)頁(yè)面的地址
void *pchecker = (char *)p + page_num*4096;
//設(shè)置最后一頁(yè)為不可讀寫
DWORD old_value;
VirtualProtect(pchecker,4096,PAGE_NOACCESS,&old_value);
return (char *)p + offset;
}
void operator delete (void *p)
{
//找到VirtualAlloc時(shí)候的起始地址
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]); //程序運(yùn)行到這里將出現(xiàn)debug中斷
delete [] a;
return 0;
}
// 注意:每次new操作,至少會(huì)創(chuàng)建比原來(lái)多4k的內(nèi)存,比較耗內(nèi)存.
// 作者 : Moonwell
// msn : archonzhao@hotmail.com
// 在需要檢測(cè)內(nèi)存越界的地方加上#include "memcheck.h"
// 程序運(yùn)行過(guò)程中,出現(xiàn)內(nèi)存越界訪問(wèn)的代碼將會(huì)出現(xiàn)中斷#ifndef _MEM_CHECK_H
#define _MEM_CHECK_H
void * operator new (size_t size)
{
//創(chuàng)建的頁(yè)面?zhèn)€數(shù)
int page_num = (int) ( size / 4096 + 1 );
//偏移量
size_t offset = page_num * 4096 - size;
//在內(nèi)存塊的后面創(chuàng)建一個(gè)額外的保護(hù)頁(yè)面,并且將頁(yè)面的屬性設(shè)置為不可讀寫
void *p = VirtualAlloc(NULL,page_num*4096+1,MEM_COMMIT,PAGE_EXECUTE_READWRITE);
//定位最后一個(gè)保護(hù)頁(yè)面的地址
void *pchecker = (char *)p + page_num*4096;
//設(shè)置最后一頁(yè)為不可讀寫
DWORD old_value;
VirtualProtect(pchecker,4096,PAGE_NOACCESS,&old_value);
return (char *)p + offset;
}
void operator delete (void *p)
{
//找到VirtualAlloc時(shí)候的起始地址
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]); //程序運(yùn)行到這里將出現(xiàn)debug中斷
delete [] a;
return 0;
}
// 注意:每次new操作,至少會(huì)創(chuàng)建比原來(lái)多4k的內(nèi)存,比較耗內(nèi)存.