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

 

posted @ 2016-03-05 10:05  91program  阅读(217)  评论(0编辑  收藏  举报