目录

基本概念

代码与实例


基本概念

这里主要的思路是,在一个对象在堆区创建后,就把他记录下来,也就是把他记录到某个地方,这个地方负责管理他(和Qt里面的对象树有异曲同工之妙)下面这个例子,把创建的新对象放到了链表里面。

有个root结点,当有新的对象被new,就把这个新对象的地址,以及其他的信息,比如大小,在哪个函数,代码在哪个文件,哪一行,以头添加的方式进行记录。

当析构,delete某个对象后使用先在对象链表中把这个对象踢出去,再使用free将其释放掉!

那么判断内存泄漏就只要遍历那个对象链表,如果存在,就打印,就证明有内存泄漏!!!

要设计一个内存检测类,就必须对默认的new进行改造!当然这个delete也要被改造。

这里new会被改造,所以在代码里面构造内存泄漏检测类的时候,一般使用malloc进行分配。

代码与实例

程序运行截图如下:

源码如下:

myleakdetector.h

#ifndef MYLEAKDETECTOR_H
#define MYLEAKDETECTOR_H
//我们要设计一个内存检查,就必须对默认的new做改造
//打桩
void* operator new(size_t _size, char* file, unsigned int _line);
void* operator new[](size_t _size, char* file, unsigned int _line);#ifndef __NEW__OVERLOADED
#define new new(__FILE__,__LINE__)
#endifclass MyLeakDetector
{
public:static unsigned int callCount;MyLeakDetector() noexcept{++callCount;}~MyLeakDetector(){if(--callCount == 0)LeakDetector();}
private:static unsigned int LeakDetector() noexcept;
};static MyLeakDetector _exit_counter;#endif // MYLEAKDETECTOR_H

main.cpp

#include <iostream>
using namespace std;class FClassErr{public:FClassErr(int n){if(n <= 0)throw 101;data = new int[n];}~FClassErr(){delete []data;}private:FClassErr(const FClassErr &){}FClassErr & operator = (const FClassErr &){}int *data;
};int main()
{int *a = new int;int *b = new int[1024];//delete a;try {FClassErr *e = new FClassErr(1);delete e;} catch (int &ex) {cout << "There is an anomaly!" << endl;}return 0;
}

myleakdetector.cpp

#include<iostream>
#include<cstring>
//定义宏,从而实现new的管理
#define __NEW__OVERLOADED
#include "myleakdetector.h"
using namespace std;typedef struct _MemoryList{struct _MemoryList *next,*prev;size_t size;//bool isArray;//是否有申请数组char *file;unsigned int line;
}_MemoryList;static unsigned long _memory_allocated = 0; //未释放的内存的大小static _MemoryList _root ={&_root,&_root,//第一个元素自引,他引指针0,false,NULL,0
};unsigned int MyLeakDetector::callCount = 0;//开始分配内存
void* AllocMemory(size_t _size,bool _array,char * _file,unsigned _line){size_t newSize = sizeof(_MemoryList)+_size;//用malloc来分配_MemoryList *newElem =(_MemoryList*)malloc(newSize);newElem->next = _root.next;newElem->prev = &_root;newElem->size = _size;newElem->isArray = _array;newElem->file= NULL;if(_file){newElem->file = (char*)malloc(strlen(_file)+1);strcpy(newElem->file,_file);}newElem->line=_line;//更新列表_root.next->prev = newElem;_root.next = newElem;//记录到未释放的内存_memory_allocated += _size;return (char*)newElem + sizeof(_MemoryList);
}void DeleteMemory(void* _ptr,bool _array){_MemoryList *currentElem = (_MemoryList*)((char*)_ptr -sizeof(_MemoryList));if(currentElem->isArray != _array)return;currentElem->prev->next = currentElem->next;currentElem->next->prev = currentElem->prev;if(currentElem->file)free(currentElem->file);free(currentElem);
}//重载new运算符
void *operator new(size_t _size){return AllocMemory(_size,false,NULL,0);
}void *operator new[](size_t _size){return AllocMemory(_size,true,NULL,0);
}void *operator new(size_t _size,char *file,unsigned _line){return AllocMemory(_size,false,file,_line);
}void *operator new[](size_t _size,char *file,unsigned _line){return AllocMemory(_size,true,file,_line);
}//重载delete
void operator delete(void* _ptr) noexcept{DeleteMemory(_ptr,false);
}void operator delete[](void* _ptr) noexcept{DeleteMemory(_ptr,true);
}unsigned int MyLeakDetector::LeakDetector(void)
noexcept{unsigned int count =0;_MemoryList *ptr = _root.next;while(ptr && ptr != &_root){if(ptr->isArray)cout << "The array leak []";elsecout << "leak";cout << ptr << " The size is : " << ptr->size << endl;if(ptr->file)cout << "location is " <<ptr->file<< ", The row is " << ptr->line << endl;elsecout << "no such file!" << endl;++count;ptr=ptr->next;}if(count)cout << "The leaking count is " << count << endl;return count;
}

C++笔记-构造内存泄漏检测类的基本思路相关推荐

  1. OpenCV中的内存泄漏检测

    转自:http://chaishushan.blog.163.com/blog/static/130192897200911685559809/ 内存泄漏时程序开发中经常遇到的问题. 而且出现内存泄漏 ...

  2. Android 性能优化之内存泄漏检测以及内存优化(上)

    在 Java 中,内存的分配是由程序完成的,而内存的释放则是由 Garbage Collecation(GC) 完成的,Java/Android 程序员不用像 C/C++ 程序员一样手动调用相关函数来 ...

  3. C++内存泄漏检测工具

    C++内存泄漏检测工具 1.VC自带的CRT:_CrtCheckMemory   调试器和 CRT 调试堆函数 1.1用法: /************************************ ...

  4. 内存泄漏检测工具(转载)

    内存泄漏检测工具2007年08月08日 1.     ccmalloc-Linux和Solaris下对C和C++程序的简单的使用内存泄漏和malloc调试库. 2.     Dmalloc-Debug ...

  5. C++ 程序内存泄漏检测方法

    一.前言 在Linux平台上有valgrind可以非常方便的帮助我们定位内存泄漏,因为Linux在开发领域的使用场景大多是跑服务器,再加上它的开源属性,相对而言,处理问题容易形成"统一&qu ...

  6. Valgrind ---内存调试,内存泄漏检测以及性能分析的软件开发工具

    Valgrind是一款用于内存调试.内存泄漏检测以及性能分析的软件开发工具.Valgrind这个名字取自北欧神话中英灵殿的入口. 一般使用方式  valgrind --leak-check=full ...

  7. Visual Studio 内存泄漏检测方法

    Visual Studio 内存泄漏检测方法 非MFC程序可以用以下方法检测内存泄露: 1.程序开始包含如下定义: #ifdef _DEBUG #define DEBUG_CLIENTBLOCK ne ...

  8. C/C++的内存泄漏检测工具Valgrind memcheck的使用经历

    Linux下的Valgrind真是利器啊(不知道Valgrind的请自觉查看参考文献(1)(2)),帮我找出了不少C++中的内存管理错误,前一阵子还在纠结为什么VS 2013下运行良好的程序到了Lin ...

  9. Android内存泄漏检测工具使用手册

    Android内存泄漏检测工具使用手册 前言 LeakCanary 在Android中接入LeakCanary LeakCanary内存泄漏分析 内存泄漏上报到服务端 Shark Shark分析当前应 ...

最新文章

  1. LeetCode简单题之拥有最多糖果的孩‭子
  2. 【FFmpeg】Hello World!尝试如何编译FFmpeg程序
  3. PL/SQL导入/导出dmp文件-Oracle表空间不一致
  4. omnigraffle 的一些总结
  5. html radio 作用域,ionic 表单输入 ion-checkbox ion-radio ion-toggle ion-spinner
  6. Java ListResourceBundle getContents()方法与示例
  7. .net core 获取binary 文件_7.2 获取文本数据_Csv.Document
  8. Java事务管理之JDBC
  9. qpython3l使用手册_qpython3l怎么用
  10. 自动档汽车正确的操作方法和习惯---请教贴
  11. 《C++(三)--多线程方法总结》
  12. DbgView 显示OutputDebugString 输出内容 不能显示问题总结
  13. R语言︱线性混合模型理论与案例探究(固定效应随机效应)
  14. LiteIDE简单使用
  15. 00018计算机应用基础2021,2021年全国自考10月00018计算机应用基础历年试题含答案.doc...
  16. LINUX编译xcb/xcb-proto
  17. 陈佩斯曾受邀喜剧综艺:被酬劳吓的恍惚好几天
  18. 英伟达RTX 2080/2080Ti发布及UltraLAB采用最新turing图灵架构深度学习硬件配置推荐
  19. QQ空间将不再支持免费备份原图?附QQ空间相册导出工具合集
  20. 跟着小梅哥初学FPGA ,vivdao开发平台,二选一多路选择器。

热门文章

  1. REDIS 在电商中的实际应用场景(转)
  2. jQuery Unveil – 另一款非常轻量的延迟加载插件
  3. UVa 439 - Knight Moves
  4. QT 网络编程(1)
  5. Centos下MySQL的安装及常见问题
  6. 阿里研究院副院长:数字化是否可以买来?
  7. 2022,这些地图可视化,够你用一整年了(附可视化素材)
  8. 学C++的你今天鄙视PHP了吗?
  9. dabeicun 2013源码下载
  10. “扎金花FANS”进行了改进