程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> VC >> 關於VC++ >> FMD開發文集 -- MFC調試模式下new操作符的特殊處理

FMD開發文集 -- MFC調試模式下new操作符的特殊處理

編輯:關於VC++

一、在調試模式下,new操作符號通過宏定義轉換成了調試版本。

在文件頭經常可以發現以下語句:

#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[]=__FILE__;
#define new DEBUG_NEW
#endif
其中,將new定義為DEBUG_NEW

二、DEBUG_NEW的處理

調試版本的new操作函數:void* AFX_CDECL operator new(size_t nSize, LPCSTR lpszFileName, int nLine);

宏替換:#define DEBUG_NEW new(THIS_FILE, __LINE__) //文件名、行號被傳入,供調試輸出。

實際代碼如下:

void* AFX_CDECL operator new(size_t nSize, LPCSTR lpszFileName, int nLine)
{
  return ::operator new(nSize, _NORMAL_BLOCK, lpszFileName, nLine);
}
//分配內存
void* __cdecl operator new(size_t nSize, int nType, LPCSTR lpszFileName, int nLine)
{
#ifdef _AFX_NO_DEBUG_CRT
  UNUSED_ALWAYS(nType);
  UNUSED_ALWAYS(lpszFileName);
  UNUSED_ALWAYS(nLine);
  return ::operator new(nSize);
#else
  void* pResult;
#ifdef _AFXDLL
  _PNH pfnNewHandler = _pfnUninitialized;
#endif
  for (;;)
  {
    pResult = _malloc_dbg(nSize, nType, lpszFileName, nLine);
    if (pResult != NULL)
      return pResult;
#ifdef _AFXDLL
    if (pfnNewHandler == _pfnUninitialized)
    {
      AFX_MODULE_THREAD_STATE* pState = AfxGetModuleThreadState();
      pfnNewHandler = pState-> m_pfnNewHandler;
    }
    if (pfnNewHandler == NULL || (*pfnNewHandler)(nSize) == 0)
      break;
#else
    if (_afxNewHandler == NULL || (*_afxNewHandler)(nSize) == 0)
      break;
#endif
  }
  return pResult;
#endif
}
#endif //_DEBUG
(全文完)

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved