AssertValid函式學習

2021-09-06 22:06:15 字數 3406 閱讀 3715

**

vc的除錯中,assertvalid和dump函式的應用

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

大多數行開始處的大括號裡的數字指定物件的分配順序。近期分配的物件具有最高編號,並顯示在轉儲的頂部。

assertvalid函式是用來推斷表示式的合法性或正確性,假設不對或不合法則終止程式並返回對應的提示資訊

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

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

linux fork 函式學習

分類 專業學習 include include include int main case 0 default printf n d n n return 0 輸出結果1 fork child i am child parent i am parent parent getpid 4496 pare...

RecalcLayout 函式學習

1 它是用來將 dialogbar等可浮動的東西安排位置 處理和view frame之間的位置關係的,例如你直接用m wnd showwindow wm hide 隱藏了工具條,那就最好呼叫這個函式重新安排一下剩下的bar和view之間的位置 2 recalclayout是cframewnd定義的虛...

htonl 函式學習

今天在網上看到一篇關於htonl 函式的解釋,感覺有道理,貼過來大家一起學習 htonl就是把本機位元組順序轉化為網路位元組順序 h host 本地主機 to 就是to 了 n net 網路的意思 l 是 unsigned long 所謂網路位元組順序 大尾順序 就是指乙個數在記憶體中儲存的時候 高...