AssertValid和Dump 這兩個函式的作用

2021-09-30 04:32:09 字數 3733 閱讀 9819

assertvalid函式是用來判斷表示式的合法性或正確性,如果不正確或不合法則終止程式並返回相應的提示資訊  

如assertvalid(t==0);//用來判斷t是否等於0,如果t!=0則終止程式  

dump函式一般用來顯示debug資訊的,其函式中的內容一般在debug時,在debug視窗中才能看到。

cobject::assertvalid   成員函式提供對物件內部狀態的執行時檢查。儘管從   cobject   派生類時不需要重寫   assertvalid,但可以通過重寫使您的類更安全可靠。assertvalid   應在物件的所有成員變數上執行斷言,以驗證它們包含有效值。例如,它應檢查指標成員變數不為   null。  

下面的示例顯示如何宣告   assertvalid   函式:  

class   cperson   :   public   cobject  

;  當重寫   assertvalid   時,在執行您自己的檢查之前請呼叫   assertvalid   的基類版本。然後使用   assert   巨集檢查您的派生類特有的成員,如下所示:     

#ifdef   _debug  

void   cperson::assertvalid()   const  

#endif  

如果任何成員變數儲存物件,則可以使用   assert_valid   巨集測試它們的內部有效性(如果它們的類重寫了   assertvalid)。  

例如,考慮   cmydata   類,該類在其成員變數之一中儲存了乙個   coblist。coblist   變數   m_datalist   儲存了乙個   cperson   物件的集合。cmydata   的簡化宣告如下所示:  

class   cmydata   :   public   cobject  

;  cmydata   中重寫的   assertvalid   如下所示:  

#ifdef   _debug  

void   cmydata::assertvalid(   )   const  

#endif  

cmydata   使用   assertvalid   機制測試其資料成員中儲存的物件的有效性。cmydata   中重寫的   assertvalid   為它自己的   m_pdatalist   成員變數呼叫   assert_valid   巨集。     

因為   coblist   類也重寫   assertvalid,所以有效性測試不在該級別停止。該重寫對列表的內部狀態執行附加有效性測試。因此,對   cmydata   物件的有效性測試將導致對儲存的   coblist   列表物件內部狀態的附加有效性測試。     

再多進行一些操作,還可以新增對儲存在列表中的   cperson   物件的有效性測試。可以從   coblist   派生   cpersonlist   類,並重寫   assertvalid。在重寫中可呼叫   cobject::assertvalid,然後迴圈訪問列表,在列表中儲存的每個   cperson   物件上呼叫   assertvalid。本主題開始所示的   cperson   類已重寫了   assertvalid。     

當為除錯生成時,這是一種功能極強的機制。當接著為發布生成時,該機制自動關閉。     

assertvalid   的限制  

給定類的   assertvalid   函式的使用者應注意該函式的限制。觸發的斷言指示物件一定有誤,並且執行將暫停。但是,缺少斷言只指示未找到任何問題,並不保證物件是好的。  

當從   cobject   派生類時,在使用   dumpallobjectssince   將物件轉儲到「輸出」視窗時,可以重寫   dump   成員函式以提供附加資訊。  

dump   函式將物件的成員變數的文字化表示形式寫入轉儲上下文   (cdumpcontext)。轉儲上下文類似於   i/o   流。可以使用插入運算子   (<<)   向   cdumpcontext   傳送資料。     

重寫   dump   函式時,應先呼叫   dump   的基類版本以轉儲基類物件的內容。然後為派生類的每個成員變數輸出文字化說明和值。  

dump   函式的宣告如下所示:  

class   cperson   :   public   cobject  

;  由於物件轉儲只在除錯程式時有意義,所以   dump   函式的宣告用   #ifdef   _debug   /   #endif   塊括起來。     

在下面的示例中,dump   函式先為其基類呼叫   dump   函式。然後,它將每個成員變數的簡短說明與該成員的值一起寫入診斷流。  

#ifdef   _debug  

void   cperson::dump(   cdumpcontext&   dc   )   const  

#endif  

必須提供   cdumpcontext   引數以指定轉儲輸出的目的地。mfc   的「debug」版本提供名為   afxdump   的預定義   cdumpcontext   物件,它將輸出傳送到偵錯程式。  

cperson*   pmyperson   =   new   cperson;  

//   set   some   fields   of   the   cperson   object.  

//...  

//   now   dump   the   contents.  

#ifdef   _debug  

pmyperson->dump(   afxdump   );  

#endif  

在   mfc   程式中,可以使用   dumpallobjectssince   轉儲有關堆中尚未釋放的所有物件的說明。dumpallobjectssince   轉儲自上個   cmemorystate::checkpoint   以來分配的所有物件。如果未發生   checkpoint   呼叫,則   dumpallobjectssince   將轉儲當前在記憶體中的所有物件和非物件。  

注意       必須先啟用診斷跟蹤,然後才能使用   mfc   物件轉儲。  

注意       程式退出時   mfc   將自動轉儲所有洩漏的物件,因此不必建立**在該點轉儲物件。  

以下**通過比較兩個記憶體狀態來測試記憶體洩漏,並在檢測到洩漏時轉儲所有物件:  

if(   diffmemstate.difference(   oldmemstate,   newmemstate   )   )  

轉儲的內容如下所示:  

dumping   objects   ->  

strcore.cpp(80)   :   non-object   block   at   $00a7521a,   9   bytes   long  

strcore.cpp(80)   :   non-object   block   at   $00a751f8,   5   bytes   long  

strcore.cpp(80)   :   non-object   block   at   $00a751d6,   6   bytes   long  

a   cperson   at   $51a4  

last   name:   smith  

first   name:   alan  

phone   #:   581-0215  

strcore.cpp(80)   :   non-object   block   at   $00a7516e,   25   bytes   long  

**:

ASSERT VALID和ASSERT巨集分析

這個巨集都是mfc的除錯巨集.assert valid巨集用來在執行時檢查乙個物件的內部合法性,比如說現在有乙個學生物件,我們知道每個學生的年齡一定大於零,若年齡小於零,則該學生物件肯定有問題。事實上,assert valid巨集就是轉化為物件的成員函式assertvalid 的呼叫,只是這種方法更...

ASSERT VALID和ASSERT巨集分析

這個巨集都是mfc的除錯巨集.assert valid巨集用來在執行時檢查乙個物件的內部合法性,比如說現在有乙個學生物件,我們知道每個學生的年齡一定大於零,若年齡小於零,則該學生物件肯定有問題。事實上,assert valid巨集就是轉化為物件的成員函式assertvalid 的呼叫,只是這種方法更...

ASSERT VALID和ASSERT巨集分析

這個巨集都是mfc的除錯巨集.assert valid巨集用來在執行時檢查乙個物件的內部合法性,比如說現在有乙個學生物件,我們知道每個學生的年齡一定大於零,若年齡小於零,則該學生物件肯定有問題。事實上,assert valid巨集就是轉化為物件的成員函式assertvalid 的呼叫,只是這種方法更...