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