C++内存泄露检测

来源:互联网 发布:跑跑卡丁车淘宝 编辑:程序博客网 时间:2024/04/28 12:34

RT,重载new和delete,在里面加上自己的东东,申请内存的时候存放结果,释放的时候标记下,最后进行统计,未被标记的就是泄露掉的;由于这里记录的是内存地址,所以可以接着释放【程序内未处理】,机制类似Java的GC。

#include <iostream>#include <cstdlib>#include <cstdio>#include <assert.h>#include <crtdbg.h>#include <stack>#include <vector>
#include <pzjay_cpy>#include <new>using namespace std;class Memory{public:Memory(void* addr = NULL){this ->addr = addr;this ->used = true;}~Memory(){delete addr;}void* addr;bool used;};class Cls{int s;public:Cls(){}~Cls(){}};//vector <void*> ptr(3);//STL声明的时候会调用new,一次性申请需要大小的内存,这里是3 * 4 = 12 bytesvoid* ary[100];static int cnt = 0;//重载new[]void * operator new[](size_t count) _THROW1(std::bad_alloc){        printf("new[], 总大小为:\t%d\n", count);return (operator new(count));}//重载newvoid* operator new(size_t size) throw(bad_alloc){printf("new:\t%d Byte\n",size);void* m=  malloc(size);if(!m) puts("out of memory");printf("new @:\t0x%0x\n", (int*)m);ary[cnt ++] = m;return m;}//重载delete[]void operator delete[](void* cnt) _THROW1(std::bad_alloc){/*数组内存布局|num|var[0]|var[1]|var[2]|var[3]|........|var[num-1]|申请数组,第一个位置放置的是数组大小,以方便delete[]在删除数组的时候判断什么时候停止*/printf("delete[], 总大小为:\t%d\n", *(int*)cnt);return (operator delete(cnt));}//重载delete,要加__CRTDECL,否则不让重载void __CRTDECL operator delete(void* m) throw(){printf("delete @:\t0x%0x\n",(int*)m);for(int i = 0; i < cnt; ++ i){if(0 == (int*)m - (int*)ary[i]){ary[i] = NULL;break;}}free(m);}void memCheck(){for(int i = 0; i < cnt; ++ i){if(NULL != ary[i])printf("memory leak @:\t0x%0x\n", ary[i]);}}int main(int argc, char* argv[]){{new int;}char* ch = new char;int* p = new int(7);delete p;Cls* s = new Cls;Cls* sa = new Cls[14];delete []sa;int* pi=new int[3];printf("\nmemory check...\n\n");memCheck();return 0;}


原创粉丝点击