亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? mfc教程_ 10內存分配方式和調試機制.htm

?? 一本優秀的vc程序學習教程,希望能夠幫助大家學習
?? HTM
?? 第 1 頁 / 共 2 頁
字號:
  <P align=justify>使用ASSERT斷言判定程序是否可以繼續執行。</P>
  <P align=justify>TRACE</P>
  <P 
  align=justify>使用TRACE宏顯示或者打印調試信息。TRACE是通過函數AfxTrace實現的。由于AfxTrace函數使用了cdecl調用約定,故可以接受個數不定的參數,如同printf函數一樣。它的定義和實現如下:</P>
  <P align=justify>void AFX_CDECL AfxTrace(LPCTSTR lpszFormat, ...)</P>
  <P align=justify>{</P>
  <P align=justify>#ifdef _DEBUG // all AfxTrace output is controlled by 
  afxTraceEnabled</P>
  <P align=justify>if (!afxTraceEnabled)</P>
  <P align=justify>return;</P>
  <P align=justify>#endif</P>
  <P align=justify></P>
  <P align=justify>//處理個數不定的參數</P>
  <P align=justify>va_list args;</P>
  <P align=justify>va_start(args, lpszFormat);</P>
  <P align=justify></P>
  <P align=justify>int nBuf;</P>
  <P align=justify>TCHAR szBuffer[512];</P>
  <P align=justify></P>
  <P align=justify>nBuf = _vstprintf(szBuffer, lpszFormat, args);</P>
  <P align=justify>ASSERT(nBuf &lt; _countof(szBuffer));</P>
  <P align=justify></P>
  <P align=justify>if ((afxTraceFlags &amp; traceMultiApp) &amp;&amp; 
  (AfxGetApp() != NULL))</P>
  <P align=justify>afxDump &lt;&lt; AfxGetApp()-&gt;m_pszExeName &lt;&lt; ": 
  ";</P>
  <P align=justify>afxDump &lt;&lt; szBuffer;</P>
  <P align=justify></P>
  <P align=justify>va_end(args);</P>
  <P align=justify>}</P>
  <P align=justify>#endif //_DEBUG</P>
  <P align=justify></P>
  <P 
  align=justify>在程序源碼中,可以控制是否顯示跟蹤信息,顯示什么跟蹤信息。如果全局變量afxTraceEnabled為TRUE,則TRACE宏可以輸出;否則,沒有TRACE信息被輸出。如果通過afxTraceFlags指定了跟蹤什么消息,則輸出有關跟蹤信息,例如為了指定“Multilple 
  Application Debug”,令AfxTraceFlags|=traceMultiApp。可以跟蹤的信息有:</P>
  <P align=justify>enum AfxTraceFlags</P>
  <P align=justify>{</P>
  <P align=justify>traceMultiApp = 1, // multi-app debugging</P>
  <P align=justify>traceAppMsg = 2, // main message pump trace (includes 
DDE)</P>
  <P align=justify>traceWinMsg = 4, // Windows message tracing</P>
  <P align=justify>traceCmdRouting = 8, // Windows command routing trace </P>
  <P align=justify>//(set 4+8 for control notifications)</P>
  <P align=justify>traceOle = 16, // special OLE callback trace</P>
  <P align=justify>traceDatabase = 32, // special database trace</P>
  <P align=justify>traceInternet = 64 // special Internet client trace</P>
  <P align=justify>};</P>
  <P 
  align=justify>這樣,應用程序可以在需要的地方指定afxTraceEnabled的值打開或者關閉TRACE開關,指定AfxTraceFlags的值過濾跟蹤信息。</P>
  <P align=justify>Visual C++提供了一個TRACE工具,也可以用來完成上述功能。</P>
  <P align=justify></P>
  <P 
  align=justify>為了顯示消息信息,MFC內部定義了一個AFX_MAP_MESSAG類型的數組allMessages,儲存了Windows消息和消息名映射對。例如:</P>
  <P align=justify>allMessages[1].nMsg = WM_CREATE,</P>
  <P align=justify>allMessages[1].lpszMsg = “WM_CREATE”</P>
  <P 
  align=justify>MFC內部還使用函數_AfxTraceMsg顯示跟蹤消息,它可以接收一個字符串和一個MSG指針,然后,把該字符串和MSG的各個域的信息組合成一個大的字符串并使用AfxTrace顯示出來。</P>
  <P align=justify>allMessages和函數_AfxTraceMsg的詳細實現可以參見AfxTrace.cpp。</P>
  <P align=justify></P>
  <LI>MFC對象內容轉儲 
  <P></P>
  <P 
  align=justify>對象內容轉儲是CObject類提供的功能,所有從它派生的類都可以通過覆蓋虛擬函數DUMP來支持該功能。在講述CObject類時曾提到過。</P>
  <P align=justify>虛擬函數Dump的定義:</P>
  <P align=justify>class ClassName : public CObject</P>
  <P align=justify>{</P>
  <P align=justify>public:</P>
  <P align=justify>#ifdef _DEBUG</P>
  <P align=justify>virtual void Dump( CDumpContext&amp; dc ) const;</P>
  <P align=justify>#endif</P>
  <P align=justify>…</P>
  <P align=justify>};</P>
  <P 
  align=justify>在使用Dump時,必須給它提供一個CDumpContext類型的參數,該參數指定的對象將負責輸出調試信息。為此,MFC提供了一個預定義的全局CDumpContext對象afxDump,它把調試信息輸送給調試器的調試窗口。從前面AfxTrace的實現可以知道,MFC使用了afxDump輸出跟蹤信息到調試窗口。</P>
  <P align=justify>CDumpContext類沒有基類,它提供了以文本形式輸出診斷信息的功能。</P>
  <P align=justify>例如:</P>
  <P align=justify>CPerson* pMyPerson = new CPerson;</P>
  <P align=justify>// set some fields of the CPerson object...</P>
  <P align=justify>//...</P>
  <P align=justify>// now dump the contents</P>
  <P align=justify>#ifdef _DEBUG</P>
  <P align=justify>pMyPerson-&gt;Dump( afxDump );</P>
  <P align=justify>#endif</P>
  <P align=justify></P>
  <LI>MFC對象有效性檢測 
  <P></P></LI></OL>
<P 
align=justify>對象有效性檢測是CObject類提供的功能,所有從它派生的類都可以通過覆蓋虛擬函數AssertValid來支持該功能。在講述CObject類時曾提到過。</P>
<P align=justify>虛擬函數AssertValid的定義:</P>
<P align=justify>class ClassName : public CObject</P>
<P align=justify>{</P>
<P align=justify>public:</P>
<P align=justify>#ifdef _DEBUG</P>
<P align=justify>virtual void AssertValid( ) const;</P>
<P align=justify>#endif</P>
<P align=justify>… </P>
<P align=justify>};</P>
<P 
align=justify>使用ASSERT_VALID宏判斷一個對象是否有效,該對象的類必須覆蓋了AssertValid函數。形式為:ASSERT_VALID(pObject)。</P>
<P align=justify>另外,MFC提供了一些函數來判斷地址是否有效,如:</P>
<P align=justify>AfxIsMemoryBlock,AfxIsString,AfxIsValidAddress。</P>
<OL>
  <OL>
    <OL>
      <P align=justify>
      <LI><A name=_Toc445889128></A><A name=_Toc445782531></A><A 
      name=_Toc452640990></A><A name=_Toc457299099></A><B>內存診斷</B> 
      <P></P></LI></OL></OL></OL>
<P align=justify>MFC使用DEBUG_NEW來跟蹤內存分配時的執行的源碼文件和行數。</P>
<P align=justify>把#define new DEBUG_NEW插入到每一個源文件中,這樣,調試版本就使用_malloc_dbg來分配內存。MFC 
Appwizard在創建框架文件時已經作了這樣的處理。</P>
<OL>
  <P align=justify>
  <LI>AfxDoForAllObjects 
  <P></P>
  <P align=justify>MFC提供了函數AfxDoForAllObjects來追蹤動態分配的內存對象,函數原型如下:</P>
  <P align=justify>void AfxDoForAllObjects( void (*pfn)(CObject* pObject, </P>
  <P align=justify>void* pContext), void* pContext ); </P>
  <P align=justify>其中:</P>
  <P align=justify>參數1是一個函數指針,AfxDoForAllObjects對每個對象調用該指針表示的函數。</P>
  <P align=justify>參數2將傳遞給參數1指定的函數。</P>
  <P 
  align=justify>AfxDoForAllObjects可以檢測到所有使用new分配的CObject對象或者CObject類派生的對象,但全局對象、嵌入對象和棧中分配的對象除外。</P>
  <P align=justify></P>
  <LI>內存漏洞檢測 
  <P></P></LI></OL>
<P align=justify>僅僅用于new的DEBUG版本分配的內存。</P>
<P align=justify>完成內存漏洞檢測,需要如下系列步驟:</P>
<UL>
  <P align=justify>
  <LI>調用AfxEnableMemoryTracking(TRUE/FALSE)打開/關閉內存診斷。在調試版本下,缺省是打開的;關閉內存診斷可以加快程序執行速度,減少診斷輸出。 

  <P></P>
  <P align=justify></P>
  <LI>使用MFC全局變量afxMemDF更精確地指定診斷輸出的特征,缺省值是allocMemDF,可以取如下值或者這些值相或: 
  <P></P></LI></UL>
<P align=justify>afxMemDF,delayFreeMemDF,checkAlwaysMemDF</P>
<P 
align=justify>其中:allocMemDF表示可以進行內存診斷輸出;delayFreeMemDF表示是否是在應用程序結束時才調用free或者delete,這樣導致程序最大可能的分配內存;checkAlwaysMemDF表示每一次分配或者釋放內存之后都調用函數AfxCheckMemory進行內存檢測(AfxCheckMemory檢查堆中所有通過new分配的內存(不含malloc))。</P>
<P align=justify>這一步是可選步驟,非必須。</P>
<UL>
  <P align=justify>
  <LI>創建一個CMemState類型的變量oldMemState,調用CMemState的成員函數CheckPoint獲得初次內存快照。 
  <P></P>
  <P align=justify></P>
  <LI>執行了系列內存分配或者釋放之后,創建另一個CMemState類型變量newMemState,調用CMemState的成員函數CheckPoint獲得新的內存快照。 

  <P></P>
  <P align=justify></P>
  <LI>創建第三個CMemState類型變量difMemState,調用CMemState的成員函數Difference比較oldMemState和newMemState,結果保存在變量difMemState中。如果沒有不同,則返回FALSE,否則返回TRUE。 

  <P></P>
  <P align=justify></P>
  <LI>如果不同,則調用成員函數DumpStatistics輸出比較結果。 
  <P></P></LI></UL>
<P align=justify>例如:</P>
<P align=justify>// Declare the variables needed</P>
<P align=justify>#ifdef _DEBUG</P>
<DIR>
<P align=justify>CMemoryState oldMemState, newMemState, diffMemState;</P>
<P align=justify>oldMemState.Checkpoint();</P></DIR>
<P align=justify>#endif</P>
<P align=justify></P>
<P align=justify>// do your memory allocations and deallocations...</P>
<P align=justify>CString s = "This is a frame variable";</P>
<P align=justify>// the next object is a heap object</P>
<P align=justify>CPerson* p = new CPerson( "Smith", "Alan", "581-0215" );</P>
<P align=justify></P>
<P align=justify>#ifdef _DEBUG</P>
<DIR>
<P align=justify>newMemState.Checkpoint();</P>
<P align=justify>if( diffMemState.Difference( oldMemState, newMemState ) )</P>
<P align=justify>{</P>
<DIR>
<P align=justify>TRACE( "Memory leaked!\n" );</P>
<P align=justify>diffMemState.DumpStatistics();</P>
<P align=justify>//or diffMemState.DumpAllObjectsSince();</P></DIR>
<P align=justify>}</P></DIR>
<P align=justify>#endif</P>
<P align=justify>MFC在應用程序(調試版)結束時,自動進行內存漏洞檢測,如果存在漏洞,則輸出漏洞的有關信息。</P>
<HR>

<TABLE cellSpacing=0 cellPadding=0 width="100%" align=center border=0>
  <TBODY>
  <TR>
    <TD align=middle><A href="http://www.vczx.com/tutorial/mfc/mfc9.php" 
      target=_self>上一章</A> <A href="http://www.vczx.com/tutorial/mfc/mfc.php" 
      target=_self>回目錄</A> <A href="http://www.vczx.com/tutorial/mfc/mfc11.php" 
      target=_self>下一章</A></TD></TR></TBODY></TABLE>
<P>&nbsp;</P>
<P align=justify></P></BODY></HTML>

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
国产精品乱码人人做人人爱| 婷婷亚洲久悠悠色悠在线播放| 美女网站一区二区| 精品少妇一区二区三区视频免付费| 亚洲自拍偷拍麻豆| 日韩一二三区视频| 岛国av在线一区| 亚洲国产精品久久人人爱蜜臀| 欧美三级中文字幕在线观看| 亚洲va中文字幕| 久久蜜臀精品av| 欧美在线综合视频| 国产精品综合视频| 午夜欧美电影在线观看| 欧美激情一二三区| 51午夜精品国产| 色综合久久综合| 国产精品自拍一区| 午夜电影网亚洲视频| 国产欧美日韩不卡免费| 欧美一区二区三区不卡| 99亚偷拍自图区亚洲| 麻豆精品在线播放| 午夜久久久久久久久久一区二区| 久久久久综合网| 日韩一卡二卡三卡四卡| 欧美伦理视频网站| 欧美午夜精品电影| 欧美综合色免费| 色噜噜狠狠一区二区三区果冻| 国产v综合v亚洲欧| 国产精品中文字幕欧美| 国产成人欧美日韩在线电影| 免费在线观看一区二区三区| 午夜精品一区二区三区三上悠亚| 中文字幕中文在线不卡住| 欧美激情一区二区三区不卡| 国产清纯白嫩初高生在线观看91| 久久在线观看免费| 国产三级精品视频| 一区在线中文字幕| 夜夜夜精品看看| 亚洲成精国产精品女| 天天色综合天天| 久久超级碰视频| 成人免费视频一区| 欧美色倩网站大全免费| 欧美乱妇23p| 国产精品久久久久久久久快鸭| 国产精品入口麻豆原神| 亚洲一区二区三区激情| 日韩av一区二区三区四区| 国产激情一区二区三区| 91麻豆国产香蕉久久精品| 欧美日韩中文字幕精品| 久久久久久久久久久久久久久99| 国产精品国产自产拍高清av王其| 香蕉av福利精品导航| 国产精品1区二区.| 777午夜精品视频在线播放| 久久看人人爽人人| 一本色道综合亚洲| 在线免费观看一区| 综合av第一页| 精品一区二区免费看| 欧美午夜电影网| 国产精品免费人成网站| 久久99国产精品久久99| 欧美怡红院视频| 一区二区三区欧美久久| 成人h动漫精品一区二区| 欧美精品丝袜久久久中文字幕| 综合欧美一区二区三区| 国产成人一区在线| 国产精品网站在线播放| 国产精一品亚洲二区在线视频| 欧美一区二区视频在线观看2020| 亚洲韩国精品一区| 91麻豆精品视频| 亚洲国产精品影院| 日韩一区二区三区免费看| 青青草国产精品97视觉盛宴| 欧美日韩国产在线播放网站| 一区二区三区四区激情| 欧美亚洲愉拍一区二区| 亚洲第一福利一区| 91超碰这里只有精品国产| 视频精品一区二区| 欧美大白屁股肥臀xxxxxx| 国产一区二区三区久久悠悠色av| 国产女人aaa级久久久级| 91在线观看高清| 免费人成网站在线观看欧美高清| 色综合久久久久综合体桃花网| 中文字幕av免费专区久久| 成人综合在线网站| 亚洲一二三区在线观看| 久久夜色精品国产欧美乱极品| 不卡视频免费播放| 免费在线观看成人| 亚洲色图欧洲色图| 日本一区二区综合亚洲| 538在线一区二区精品国产| 99re成人在线| 国产黄色精品视频| 麻豆精品久久精品色综合| 亚洲电影第三页| 亚洲一区二区av在线| 综合激情成人伊人| 精品sm在线观看| 欧美一激情一区二区三区| 日本精品视频一区二区| 成人99免费视频| 国产九九视频一区二区三区| 麻豆国产91在线播放| 亚洲风情在线资源站| 亚洲女性喷水在线观看一区| 国产精品久久久久影院色老大| 久久婷婷久久一区二区三区| 久久色在线视频| 欧美国产成人精品| 亚洲精品视频在线看| 亚洲午夜视频在线| 日韩成人dvd| 国产99久久久国产精品潘金网站| 国产综合色视频| 97se狠狠狠综合亚洲狠狠| 色噜噜狠狠一区二区三区果冻| 欧美日韩在线免费视频| 欧美刺激脚交jootjob| 国产精品久久三| 日韩av一区二区三区四区| 国产很黄免费观看久久| 26uuuu精品一区二区| 亚洲欧美怡红院| 美女一区二区久久| 色哟哟亚洲精品| 国产亚洲精品超碰| 亚洲自拍偷拍欧美| 波多野结衣一区二区三区| 欧美一区二区三区日韩| 亚洲精品免费在线观看| 国产成人夜色高潮福利影视| 在线中文字幕一区二区| 国产精品免费久久| 亚洲国产欧美在线| 91麻豆精品秘密| 国产精品的网站| 国产成人综合网| 欧美岛国在线观看| 日韩专区在线视频| 欧美亚洲自拍偷拍| 日韩一区在线免费观看| 成人综合婷婷国产精品久久| 久久久久久久久久久电影| 免费在线观看一区| 日韩欧美电影在线| 国产揄拍国内精品对白| 337p粉嫩大胆噜噜噜噜噜91av| 日日骚欧美日韩| 欧美一区二区三区日韩| 日本怡春院一区二区| 欧美一区二区视频在线观看 | 日韩av一区二区三区四区| 91高清视频免费看| 亚洲成人一二三| 在线不卡a资源高清| 久久99国内精品| 国产精品欧美久久久久一区二区| 欧美午夜在线一二页| 偷拍日韩校园综合在线| 日韩三级电影网址| 国产大片一区二区| 一区二区三区在线观看视频| 欧美精品一级二级三级| 国产精品一区二区x88av| 国产精品视频第一区| 91精品国产综合久久精品麻豆| 免费在线观看日韩欧美| 国产精品久久久久久久久图文区 | 成人影视亚洲图片在线| 国产精品成人免费精品自在线观看| 欧美日韩一卡二卡| 国产又粗又猛又爽又黄91精品| 中文字幕日本乱码精品影院| 欧美性大战久久久久久久蜜臀| 精品一区二区成人精品| 日韩一区欧美小说| 26uuu成人网一区二区三区| 欧美在线观看视频一区二区三区| 国产一区二区三区免费播放| 偷拍与自拍一区| 亚洲国产精品天堂| 亚洲精品国产无天堂网2021| 久久精品免费在线观看| 久久―日本道色综合久久| 欧美日韩精品高清| 欧美日韩一区二区三区在线 | 国产色一区二区| 精品国产电影一区二区|