zoukankan      html  css  js  c++  java
  • EVC内存检测

    将以下代码保存为.h文件,在待检测的应用中调用它。

      1 /*****************************************************************
      2 为了使用内存检测,需要在待检测代码中进行以下三步:
      3 1. Define _DEBUG #define _DEBUG
      4 2. Include "crtdbg.h" #include "crtdbg.h"
      5 3. Let your first line in the code be: _CrtSetDbgFlag (ON);
      6 ********************************************************************/
      7 #ifndef _CRTDBG_HEADER
      8 #define _CRTDBG_HEADER
      9 #ifdef _DEBUG
     10  
     11 extern "C" void WINAPIV NKDbgPrintfW(LPCWSTR lpszFmt, ...);
     12 struct CrtFileName
     13 {
     14 unsigned short* _pusCrtName;
     15 CrtFileName* _pCrtNext;
     16 };
     17  
     18 struct _CrtMem
     19 {
     20 CrtFileName* _pCrtFileName;
     21 int _iCrtLine;
     22 unsigned int _uiCrtMemLen;
     23 void* _pCrtMemAddr;
     24 _CrtMem* _pCrtNext;
     25 };
     26  
     27 void* operator new(unsigned int s,unsigned short* name,int line);
     28 inline void* __cdecl operator new(unsigned int s)
     29  { return ::operator new(s, _T(__FILE__), __LINE__); }
     30  
     31 void __cdecl operator delete(void *pvMem);
     32  
     33 class garbageCollector
     34 {
     35 public:
     36 garbageCollector () {}
     37 ~garbageCollector ();
     38 };
     39 #define _CrtSetDbgFlag(ignore) garbageCollector gb;
     40  _CrtMem* _pCrtMemRoot = 0;
     41 CrtFileName* _pCrtFileNameRoot = 0;
     42 void* operator new(unsigned int s,unsigned short* name,int line)
     43 {
     44  void* retPtr = malloc (s);
     45 if (retPtr)
     46 { _CrtMem* _crtMemCell = (struct _CrtMem*)malloc (sizeof(_CrtMem));
     47  _crtMemCell->_iCrtLine = line;
     48 _crtMemCell->_uiCrtMemLen = s;
     49 _crtMemCell->_pCrtMemAddr = retPtr;
     50 _crtMemCell->_pCrtNext = 0; CrtFileName* _tmpCrtFileName;
     51 for (_tmpCrtFileName = _pCrtFileNameRoot;
     52  _tmpCrtFileName && wcscmp(name, _tmpCrtFileName->_pusCrtName);
     53  _tmpCrtFileName = _tmpCrtFileName->_pCrtNext) {}
     54  
     55  if (!_tmpCrtFileName)
     56 { unsigned short* _crtName = (unsigned short*)malloc ((wcslen (name) + 1) * sizeof(unsigned short));
     57 wcscpy (_crtName, name); CrtFileName* _crtFileName = (struct CrtFileName*)malloc (sizeof (CrtFileName));
     58 _crtFileName->_pusCrtName = _crtName;
     59  _crtFileName->_pCrtNext = 0; if (!_pCrtFileNameRoot) _pCrtFileNameRoot = _crtFileName;
     60  else { for (_tmpCrtFileName = _pCrtFileNameRoot;
     61 _tmpCrtFileName->_pCrtNext;
     62 _tmpCrtFileName = _tmpCrtFileName->_pCrtNext);
     63  _tmpCrtFileName->_pCrtNext = _crtFileName;
     64 }
     65 _tmpCrtFileName = _crtFileName;
     66 }
     67  _crtMemCell->_pCrtFileName = _tmpCrtFileName;
     68 if (!_pCrtMemRoot) { _pCrtMemRoot = _crtMemCell; }
     69 else { _CrtMem* _tmpMemPtr; for (_tmpMemPtr = _pCrtMemRoot; _tmpMemPtr->_pCrtNext; _tmpMemPtr = _tmpMemPtr->_pCrtNext); _tmpMemPtr->_pCrtNext = _crtMemCell;
     70 }
     71 }
     72 return retPtr;
     73 }
     74  
     75 void __cdecl operator delete(void *pvMem)
     76 { if (pvMem)
     77 { _CrtMem* _tmpMem;
     78 if (pvMem == _pCrtMemRoot->_pCrtMemAddr)
     79 { _tmpMem = _pCrtMemRoot; _pCrtMemRoot = _pCrtMemRoot->_pCrtNext; free (_tmpMem);
     80 }
     81 else
     82 { for (_tmpMem = _pCrtMemRoot; _tmpMem->_pCrtNext && (_tmpMem->_pCrtNext->_pCrtMemAddr != pvMem);
     83  _tmpMem = _tmpMem->_pCrtNext);
     84 if (_tmpMem->_pCrtNext)
     85 { _CrtMem* _tmpMem2;
     86 _tmpMem2 = _tmpMem->_pCrtNext;
     87  _tmpMem->_pCrtNext = _tmpMem2->_pCrtNext;
     88 free (_tmpMem2); }
     89 else
     90 NKDbgPrintfW (_T("%s(%i) : Warning : deletes memory pointer not allocated with new!/n"), _T(__FILE__), __LINE__);
     91 }
     92 free (pvMem);
     93 }
     94 }
     95  
     96 garbageCollector::~garbageCollector ()
     97  { if (!_pCrtMemRoot) NKDbgPrintfW (_T("No memory leaks detected!/n"));
     98 else { _CrtMem* _tmpMem; NKDbgPrintfW (_T("Detected memory leaks!/nDumping objects ->/n"));
     99 for (_tmpMem = _pCrtMemRoot; _tmpMem; _tmpMem = _tmpMem->_pCrtNext)
    100 {
    101  NKDbgPrintfW (_T("%s(%i) : normal block at 0x%08X, %i bytes long/n Data <"), _tmpMem->_pCrtFileName->_pusCrtName, _tmpMem->_iCrtLine, _tmpMem->_pCrtMemAddr, _tmpMem->_uiCrtMemLen);
    102  
    103 for (unsigned int i = 0; i < _tmpMem->_uiCrtMemLen; i++)
    104 NKDbgPrintfW (_T("%c"), *(((char*)_tmpMem->_pCrtMemAddr)+i)); NKDbgPrintfW (_T(">/n"));
    105  }
    106 }
    107 CrtFileName* _tmpName = _pCrtFileNameRoot;
    108 for (;_tmpName;)
    109 { _pCrtFileNameRoot = _tmpName->_pCrtNext; free(_tmpName->_pusCrtName); free(_tmpName); _tmpName = _pCrtFileNameRoot;
    110 }
    111 } #else
    112 #define _CrtSetDbgFlag(ignore) #endif //DEBUG #endif //HEADER
  • 相关阅读:
    20200813质因数分解 --已知正整数n是两个不同的质数的乘积,试求出较大的那个质数 (奥赛一本通 P71 8)
    20200807求梯形面积,要求输入浮点数,输出精度为2位
    c++语言printf()输出格式大全 scanf()输入格式大全
    20200803给出一 名学生的语文和数学成绩,判断他是否恰好有一门课不及格(<60分),如果是输出1;否则输出0(奥赛一本通 p32 10)
    20200803-判断一个数能否同时被3,5,7整除(奥赛一本通 p32 9)
    20200802--利用公式 e=1+1/1!+1/2!+...+1/n!,求e的值, 要求保留小数点后10位(奥赛一本通 p67 2)
    20200802 给定正整数n,求不大于n的正整数的阶乘的和(即求1!+2!+...+n!),输出阶乘的和 (奥赛一本通p67 1题)
    线程
    mysql逻辑架构
    《python网络数据采集》笔记2
  • 原文地址:https://www.cnblogs.com/91program/p/5244201.html
Copyright © 2011-2022 走看看