自己实现简易的内存泄露检测工具VLD
来源:互联网 发布:nginx etag 配置 编辑:程序博客网 时间:2024/06/05 23:39
有一个很著名的内存泄露检测工具Visual leak detected想必大家都不陌生,但今天我们可以自己写一个简易版的。哈哈,自己动手,丰衣足食有木有!!!
它的原理就是我们重载了操作符new和delete,当用new开辟空间的时候,就讲这块空间串到我们定义的结构体MEMNode形成的链表中,(这是老师的写法,在main程序结束时,用check_vld()函数检测有没有内存泄露)但我觉得,如果我们动态开辟了一个对象,在它的析构函数里用delete释放的话,这种方法就不太可行。因为析构函数只有到return时才会被调用(在check_vld()函数之前)。检测结果就不准确。由此我想到,可以将这个结构体该为C++中的类class MEMNode,并将其指针也封装为一个类PMEMNode,然后定义一个PMEMNode的全局静态成员(它会在主函数之前被构造,主函数结束后析构)。并将check_vld()的代码放在他的析构函数中。
废话不多说,代码在下面:
vld.h:
#pragma once#include <iostream>using namespace std;class MemNode {friend void* operator new(size_t sz, char *filename, int line);public:MemNode(int s = 0,char *pf = NULL, int l = 0,class MemNode *pl=NULL):size(s),file(pf),line(l),link(pl){}~MemNode(){}void set(int sz, char *pf, int l, class MemNode *pl){size = sz;file = pf;line = l;link = pl;}void setlink(MemNode *pl){link = pl;}int getsize(){return size;}char *getfile(){return file;}int getline(){return line;}MemNode *getlink(){return link;}private:int size;char *file;int line;class MemNode *link;};void check_vld();class pMemNode {public:pMemNode(MemNode *ptr=NULL):p(ptr){}~pMemNode(){check_vld();}MemNode *getptr(){return p;}void setptr(MemNode *ptr){p = ptr;}private:MemNode *p;};static pMemNode _AfxMem;void* operator new(size_t sz,char *filename,int line){void *result=NULL;int total_size = sz + sizeof(MemNode);MemNode *p = new MemNode[total_size];p->set(sz, filename, line, NULL);if (_AfxMem.getptr() == NULL){_AfxMem.setptr(p);}else{p->setlink(_AfxMem.getptr());_AfxMem.setptr(p);}result = _AfxMem.getptr()+1;return result;}void operator delete(void *ptr){if(_AfxMem.getptr()==NULL){return;}if(ptr==NULL){return;}MemNode *p;if (_AfxMem.getptr()+1 == ptr){p = _AfxMem.getptr();_AfxMem.setptr(p->getlink());delete p;}else{p = _AfxMem.getptr();while (p->getlink() != NULL && p->getlink()+1!=ptr){p = p->getlink();}if (p->getlink() != NULL){MemNode *q = p->getlink();p->setlink(q->getlink());delete q;}}}void check_vld(){if (_AfxMem.getptr() == NULL){cout << "No memory Leaks detected." << endl;}else{MemNode *p = _AfxMem.getptr();cout << "WARNING: Visual Leak Detector detected memory leaks!" << endl;while (p != NULL){printf("At %p: %d Bytes\n", p + 1, p->getsize());printf("file: %s, line: %d\n", p->getfile(), p->getline());p = p->getlink();}}}
Main.cpp:
#include <iostream>#include <string>#include "vld.h"using namespace std;class Test{public:Test(char *str){int a = strlen(str) + 1;ch = new(__FILE__, __LINE__) char[a];//strcpy(ch, str);}~Test(){delete[]ch;ch = NULL;}private:char *ch;int a;double b;char c;};int main(){//VLD vld;int a = 10;Test t("hello");//int *p = new(__FILE__,__LINE__) int(10);//double *q = new(__FILE__,__LINE__) double(12.34);Test *s = new(__FILE__,__LINE__) Test("hello");//delete p;//delete q;//check_vld();return 0;}
1 0
- 自己实现简易的内存泄露检测工具VLD
- vld 内存泄露检测工具vld的实现
- 内存泄露检测工具[VLD, LeakDiag]
- 内存泄露检测工具[VLD, LeakDiag]
- 内存泄露检测工具[VLD, LeakDiag]
- 内存泄露检测工具[VLD, LeakDiag]
- 内存泄露检测工具【VLD v2.2.3】
- 内存泄露检测工具【VLD v2.2.3】
- vld(Visual Leak Detector 内存泄露检测工具
- 内存泄露检测工具【VLD v2.2.3】
- Qt5使用内存泄露检测工具—VLD
- vld(Visual Leak Detector) 内存泄露检测工具
- Visual C++内存泄露检测工具(VLD)
- Qt5使用内存泄露检测工具—VLD
- Visual C++内存泄露检测工具(VLD)
- Visual C++内存泄露检测工具(VLD)
- 实验第三方的内存泄露检测工具VLD(Visual Leak Detector)
- VS2012+Vld内存泄漏检测工具的安装
- C++虚函数和纯虚函数
- NYOJ 456 邮票分你一半(01背包)
- Python3 Hovercraft创建impressive.js演示文档(三)
- memdev.c字符设备驱动分析(转载)
- IP协议详解
- 自己实现简易的内存泄露检测工具VLD
- VMware 11.0 简体中文版|附永久密钥
- 树莓派增加apt-get下载源的方法
- syslog函数详解 http://blog.chinaunix.net/uid-10540984-id-3506091.html
- MySQL优化
- jsp小后门
- 循环——面积循环版
- 计算机网络之面试常考
- AngularJS的digest循环和$apply