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 的呼叫,只是這種方法更...