AfxCheckMemory??
BOOL AfxCheckMemory( );??? // 檢查當前分配的所有內存的完整性
返回值:如果沒有內存錯誤,則為非零值;否則為0。
說明:
這個函數使自由內存池有效并在需要時輸出錯誤信息。如果這個函數沒有檢測到內存沖突,它什么也不輸出。
當前在堆中分配的所有內存塊都會被檢查,包括那些用 new分配的內存,但是不包括那些用直接調用內存分配函數分配的內存,例如malloc函數或者Windows的GlobalAlloc函數。如果發現有內存塊存在錯誤,就會在調試器上輸出錯誤信息。
如果你在程序模塊中包含了下面的程序行:
#define new DEBUG_NEW
后面對AfxCheckMemory的調用都會顯示發生內存分配的文件名和行號。
注意:
如果你的模塊中包含了一個或多個串行化類的實現,那么你必須在最后一個IMPLEMENT_SERIAL宏之后包含#define程序行。這個函數僅在MFC的調試版本中起作用。
示例:
// AfxCheckMemory的例子
CAge* pcage = new CAge( 21 ); // CAge 是從 CObject.繼承而來的
Age* page = new Age( 22 ); // Age 不是從 CObject.繼承的
*(((char*) pcage) - 1) = 99; // 破壞前面的保護字節
*(((char*) page) - 1) = 99; // 破壞前面的保護字節
AfxCheckMemory();
程序的結果如下:
memory check error at $0067495F = $63, should be $FD
DAMAGE: before Non-Object block at $00674960
Non-Object allocated at file test02.cxx(48)
Non-Object located at $00674960 is 2 bytes long
memory check error at $00674905 = $63, should be $FD
DAMAGE: before Object block at $00674906
Object allocated at file test02.cxx(47)
Object located at $00674906 is 6 bytes long
AfxDump
void AfxDump(const CObject* pOb);??? // 如果在調試器內調用,則轉存對象的狀態
參數: pOb 指向由CObject繼承的類的對象的指針。
說明:
在調試器中調用這個函數以在調試時轉儲對象的狀態。AfxDump調用一個對象的Dump函數并且將信息發送到afxDump變量指定的位置。AfxDump僅能在MFC的調試版本中使用。
你的程序代碼不應該調用AfxDump,而是應該調用適當對象的Dump成員函數。
AfxDumpStack
void AFXAPI AfxDumpStack(DWORD dwTarget = AFX_STACK_DUMP_TARGET_DEFAULT); // 生成當前棧的一個映像,該函數通常被靜態鏈接
參數: dwTarget 指出轉儲輸出的目標。其取值可以用位或操作符(|)組合起來,可能值如下: · AFX_STACK_DUMP_TARGET_TRACE 通過TRACE宏輸出。TRACE僅僅在調試版本中產生輸出,在發行版本中不產生輸出。同時,TRACE可以被重定向到調試器以外的目標。
· AFX_STACK_DUMP_TARGET_DEFAULT 將轉儲輸出發送到缺省目標。對于調試版本,輸出發送給TRACE宏。在發行版本中,輸出發送到剪貼板。
· AFX_STACK_DUMP_TARGET_CLIPBOARD 輸出僅發送到剪貼板。數據將按CF_TEXT格式以普通文本的形式放在剪貼板上。
· AFX_STACK_DUMP_TARGET_BOTH 同時將輸出發送到剪貼板和TRACE宏。
· AFX_STACK_DUMP_TARGET_ODS 通過Win32函數OutputDebugString()直接將輸出發送的調試器。如果連接了調試器,它在調試版本和發行版本中都會產生調試器輸出。AFX_STACK_DUMP_TARGET_ODS 通常到達調試器(如果連接了調試器),并且不能被重定向。
說明:
這個全局函數可以被用來生成當前棧的一個映象。下面的例子反映了MFC對話框應用程序中按鈕處理函數調用AfxDumpStack所產生的單行調試輸出:
=== begin AfxDumpStack output ===
...
BFF928E0: WINDOWS\SYSTEM\KERNERL32.DLL! UTUnRegister + 2492 bytes
=== end AfxDumpStack() output ===
BFF928E0: 最近一次函數調用的返回地址
WINDOWS\SYSTEM\KERNEL32.DLL! 包含函數調用的模塊的完整路徑名
UTUnRegister 調用的函數原型
+ 2492 bytes 以字節為單位的從函數原型地址(這個例子中為UTUnregister)到返回地址(這個例子中為BEF928E0)的偏移
AfxDumpStack在MFC庫的調試版本和非調試版本中都可以使用。但是,這個函數通常是靜態連接的,即使你的可執行文件以共享DLL的方式使用MFC。
在共享庫的實現中,可以在MFCS42.LIB庫(以及它的變化形式)中找到這個函數。
為了成功地使用這個函數:
??????? · 在你的路徑中必須包含IMAGEHLP.DLL文件。如果你沒有這個DLL文件,這個函數會顯示一條錯誤信息。IMAGEHLP.DLL是隨Win32 SDK和Windows一起發售的可散發的DLL。在C:\[Windows]\system[32]下查找它。有關IMAGEHLP提供的函數集的介紹可以參考“可移植的可執行文件的操作”一文。
??????? · 具有棧框架的模塊必須包含調試信息。如果它不包含調試信息,這個函數仍然會生成對棧的跟蹤,但是這種跟蹤是很簡略的。
AfxEnableMemoryTracking
BOOL AfxEnableMemoryTracking(BOOL bTrack); // 打開或關閉內存跟蹤
返回值:以前的跟蹤允許狀態設置。
參數: bTrack 將這個值設為TRUE時就打開了內存跟蹤特性。如果是FALSE則將其關閉。
說明:
診斷內存跟蹤通常在MFC的調試版本中有效。利用這個函數對你的代碼中正確分配內存的部分禁止跟蹤。
有關AfxEnableMemoryTracking的更多信息請參見《Visual C++程序員指南》中的“MFC調試支持”。
注意:這個函數僅在MFC的調試版本中起作用。
AfxIsMemoryBlock
BOOL AfxIsMemoryBlock( const void* p, UINT nBytes, LONG* plRequestNumber = NULL ); // 檢驗一個內存塊是否被正確的分配
返回值:
如果內存塊是現在分配的,并且其長度也是正確的,則返回非零值。否則為0。
參數: p 指向將被測試的內存塊。
nBytes 包含了以字節為單位的內存塊長度。
plRequestNumber 指向一個長整數,它將被設為內存塊的分配系列號碼。由plRequestNumber指向的這個變量只有當AfxIsMemoryBlock返回非零值時才會被填充。
說明:
檢測一個內存地址,確保它代表了一個由new的診斷版本分配的活動的內存塊。它同時也檢驗指定的大小是否與最初分配的大小相符。如果這個函數返回非零值,分配的系列號碼將在plRequestNumber中返回。這個號碼代表了這個內存塊相對于其它所有內存分配的順序。
示例:
// AfxIsMemoryBlock的例子
CAge* pcage = new CAge( 21 ); // CAge is derived from CObject.
ASSERT( AfxIsMemoryBlock( pcage, sizeof( CAge ) ) )
AfxIsValidString
BOOL AfxIsValidString( LPCSTR lpsz, int nLength = -1 ); // 檢驗一個字符串指針是否有效
如果給定的指針指向一個給定大小的字符串則返回非零值,否則返回0。
參數: lpsz 要測試的指針。
nLength 指定要測試的字符串的長度,以字節為單位。如果值為-1,表示字符串是以null結尾的。
說明:
使用這個函數來確定指向字符串的指針是否有效。
AfxSetAllocHook
AFX_ALLOC_HOOK AfxSetAllocHook( AFX_ALLOC_HOOK pfnAllocHook ); // 允許在每次進行內存分配事調用一個函數
如果你希望允許分配,則返回非零值。否則返回0。
參數: pfnAllocHook 指定要調用的函數名。參考關于分配函數的原型的說明。
說明:
這個函數設置一個鉤子,使每次分配內存之前都會調用一個指定的函數。微軟基礎類庫中的調試內存分配函數能夠調用一個用戶定義的鉤子函數,使用戶能夠監控內存分配并控制是否允許分配內存。內存分配的鉤子函數的原型如下:
BOOL AFXAPI AllocHook( size_t nSize, BOOL bObject, LONG lRequestNumber );
nSize 計劃分配的內存大小。
bObject 如果是要為一個CObject派生類對象分配內存則為TRUE,否則為FALSE。
lRequestNumber 內存分配的系列號。
注意,AFXAPI調用約定意味著調用者必須從棧中清除參數。
AfxDoForAllClasses
void AFXAPI AfxDoForAllClasses(
void (* pfn)(const CRuntimeClass* pClass, void* pContext),
void* pContext
); //對所有從CObject繼承的支持運行時檢查的類執行一個特定的功能
參數: pfn 指向每個類都會調用的重復函數。這個參數是一個指向CRuntimeClass對象的指針以及指向調用者提供給函數的附加數據的void指針。
pContext 指向調用者提供給重復函數的可選數據的指針。這個指針可以是NULL。
說明:
在應用程序的內存空間中,為所有從CObject繼承的可串行化的類調用指定的重復函數。從CObject繼承的可串行化的類是以DECLARE_SERIAL宏繼承的。每次調用指定的重復函數時,都會將在pContext中傳遞給AfxDoForAllClasses的指針傳遞給重復函數。
注意:這個函數僅在MFC的調試版本中起作用。
AfxDoForAllObjects
void AfxDoForAllObjects(
void (* pfn)(CObject* pObject, void* pContext),
void* pContext
); // 對所有從CObject繼承的用new分配內存對象執行一個指定的功能
參數:pfn 指向每個對象都執行的重復函數。函數的參數是一個指向CObject的指針以及指向調用者提供給函數的附加數據的void指針。
pContext 指向調用者提供給函數的附加數據的指針。這個指針可以為NULL。
說明:
對每個用new分配的從CObject繼承的對象執行指定的重復函數。棧、全局變量或嵌入對象不包括在內。每次調用指定的重復函數時,都會將在pContext中傳遞給AfxDoForAllObjects的指針傳遞給重復函數。
注意:這個函數僅在MFC的調試版本中起作用。
from:http://hi.baidu.com/ice_water/blog/item/7cef04f73475c42a720eec98.html
posted on 2010-11-25 15:06
我風 閱讀(1416)
評論(0) 編輯 收藏 引用