C++简单内存泄漏检查机制实现_C/C++语言_黑客防线网安服务器维护基地--Powered by WWW.RONGSEN.COM.CN

C++简单内存泄漏检查机制实现

作者:黑客防线网安C/C++教程基地 来源:黑客防线网安C/C++教程基地 浏览次数:0

本篇关键词:机制实现检查内存
黑客防线网安网讯:  这里是一个简单的内存泄漏自动检查机制。只适用于单线程情况下。工作原理就是将已经分配的内存用一个双向链表串联起来,释放内存时从链表里删除。在程序退出时,将链表中未释放的内存打...
  这里是一个简单的内存泄漏自动检查机制只适用于单线程情况下工作原理就是将已经分配的内存用一个双向链表串联起来释放内存时从链表里删除。在程序退出时将链表中未释放的内存打印出来。同时在内存块中保存文件名和行号,用于定位内存分配地址。
  001 // placement_new.cpp : Defines the entry point for the console application.
  002 //
  003
  004 #include "stdafx.h"
  005 #include <iostream>
  006 #include <cassert>
  007
  008 #define ASSERT assert
  009 char buff[1024];
  010
  011 using namespace std;
  012
  013 struct MEMORY_TAG
  014 {
  015 int nSize;
  016 const char* szFile;
  017 int nLine;
  018 MEMORY_TAG* pPrev;
  019 MEMORY_TAG* pNext;
  020 };
  021
  022 MEMORY_TAG g_header = {0, 0, 0, 0, 0};
  023 // 打印出所有未释放的内存
  024 void DumpUnAllocatedMem()
  025 {
  026 for(MEMORY_TAG* pEntry = g_header.pNext; pEntry; pEntry = pEntry->pNext)
  027 {
  028 printf("%s(%d) : leak %d bytes ", pEntry->szFile ? pEntry->szFile : "", pEntry->nLine, pEntry->nSize);
  029 }
  030 }
  031 // 统计已经分配的内存块数和字节数
  032 int CountOfAllocatedMem(void* pnSize= NULL)
  033 {
  034 int nCount = 0;
  035 size_t allocated = 0;
  036 for(MEMORY_TAG* pEntry = g_header.pNext; pEntry; pEntry = pEntry->pNext)
  037 {
  038 allocated += pEntry->nSize;
  039 nCount++;
  040 }
  041 printf("%d count, %d total ", nCount, allocated);
  042 return nCount;
  043 }
  044
  045 // 实现一个全局operator new可以有文件名和行号作为参数
  046 void* operator new(size_t size, const char* pszFile, int line)
  047 {
  048 size_t nRealSize = size + sizeof(MEMORY_TAG);
  049 MEMORY_TAG* pTag = (MEMORY_TAG*)malloc(nRealSize);
  050
  051 pTag->nSize = nRealSize;
  052 pTag->szFile = pszFile;
  053 pTag->nLine = line;
  054 // 插入队列头部
  055 if (g_header.pNext)
  056 {
  057 g_header.pNext->pPrev = pTag;
  058 }
  059 pTag->pNext = g_header.pNext;
  060 g_header.pNext = pTag;
  061 pTag->pPrev = &g_header;
  062
  063 return pTag + 1;
  064 }
  065
066 void* operator new(size_t size)
  067 {
  068 return (operator new(size, __FILE__, __LINE__));
  069 }
  070
  071
  072 void operator delete(void* p, const char*, int line)
  073 {
  074 delete p;
  075 }
  076
  077 void operator delete(void* p)
  078 {
  079 MEMORY_TAG* pTag = (MEMORY_TAG*)(((char*)p)-sizeof(MEMORY_TAG));
  080 // 从队列中删除
  081 pTag->pPrev->pNext = pTag->pNext;
  082 if (pTag->pNext)
  083 {
  084 pTag->pNext->pPrev = pTag->pPrev;
  085 }
  086 free(pTag);
  087 }
  088
  089 class Object
  090 {
    黑客防线网安服务器维护方案本篇连接:http://www.rongsen.com.cn/show-15008-1.html
网站维护教程更新时间:2012-04-04 22:48:21  【打印此页】  【关闭
我要申请本站N点 | 黑客防线官网 |  
专业服务器维护及网站维护手工安全搭建环境,网站安全加固服务。黑客防线网安服务器维护基地招商进行中!QQ:29769479

footer  footer  footer  footer