物件傾印解譯
更新:2007 年 11 月
這個主題適用於:
版本 |
Visual Basic |
C# |
C++ |
Web Developer |
---|---|---|---|---|
Express 版 |
僅適用原生 |
|||
Standard 版 |
僅適用原生 |
|||
Pro/Team 版 |
僅適用原生 |
表格圖例:
套用 |
|
不套用 |
|
預設隱藏的命令。 |
請看此物件傾印的詳細內容:
{5} strcore.cpp(80) : non-object block at $00A7521A, 9 bytes long
{4} strcore.cpp(80) : non-object block at $00A751F8, 5 bytes long
{3} strcore.cpp(80) : non-object block at $00A751D6, 6 bytes long
{2} a CPerson at $51A4
Last Name: Smith
First Name: Alan
Phone #: 581-0215
{1} strcore.cpp(80) : non-object block at $00A7516E, 25 bytes long
產生這種傾印的程式只有兩種明確的配置,一種是在堆疊上,另一種是在堆積上:
// Do your memory allocations and deallocations.
CString s("This is a frame variable");
// The next object is a heap object.
CPerson* p = new CPerson( "Smith", "Alan", "581-0215" );
CPerson 建構函式 (Constructor) 需要三個 char 指標的引數 (用來初始化 CString 成員變數)。在記憶體傾印裡,您可以看到 CPerson 物件和三個非物件區塊 (3、4 和 5)。這些物件會儲存 CString 成員變數字元,且在不會在叫用 (Invoke) CPerson 物件解構函式 (Destructor) 刪除。
區塊編號 2 是 CPerson 物件本身。$51A4 表示區塊的位址而且後面跟著物件的內容 (呼叫 DumpAllObjectsSince 時,由 CPerson::Dump 所輸出)。
您可以由區塊編號 1 的順序號碼和大小猜想出它與 CString 框架變數相關,這些資訊符合 CString 框架變數裡的字元數字。框架上配置的變數在框架超過範圍 (Scope) 時會自動解除配置。
框架變數
一般來說,您不必擔心與框架變數相關的堆積物件,因為它們會在框架變數超過範圍時自動解除配置。若要避免在記憶體診斷傾印裡發生混亂,您應該定位 Checkpoint 呼叫,這樣它們會在框架變數範圍的外部。例如,將範圍括號放在前述配置程式碼的前後,如下所示:
oldMemState.Checkpoint();
{
// Do your memory allocations and deallocations ...
CString s("This is a frame variable");
// The next object is a heap object.
CPerson* p = new CPerson( "Smith", "Alan", "581-0215" );
}
newMemState.Checkpoint();
加了範圍括號,這個範例的記憶體傾印如下:
Dumping objects ->
{5} strcore.cpp(80) : non-object block at $00A7521A, 9 bytes long
{4} strcore.cpp(80) : non-object block at $00A751F8, 5 bytes long
{3} strcore.cpp(80) : non-object block at $00A751D6, 6 bytes long
{2} a CPerson at $51A4
Last Name: Smith
First Name: Alan
Phone #: 581-0215
非物件配置
請注意有些配置是物件 (例如 CPerson) 而有些則是非物件配置。「非物件配置」是指不是從 CObject 衍生之物件的配置,或是基本 C 型別 (例如 char、int 或 long) 的配置。如果 CObject 衍生類別配置額外空間 (例如為內部緩衝區),則該類物件便會顯示物件和非物件配置。
防止記憶體遺漏
請注意,在上面的程式碼中,與 CString 框架變數相關聯的記憶體區塊已經自動解除配置,而且不會顯示為記憶體遺漏。與範圍規則相關的自動解除配置會處理大多數與框架變數相關的記憶體遺漏。
然而,對於堆積上的物件配置,您必須明確地刪除物件以防止記憶體遺漏。若要清除先前範例裡最後的記憶體遺漏,請參考下列程式碼,刪除配置在堆積的 CPerson 物件:
{
// Do your memory allocations and deallocations.
CString s("This is a frame variable");
// The next object is a heap object.
CPerson* p = new CPerson( "Smith", "Alan", "581-0215" );
delete p;
}